This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
vector<Account*> Account::accounts = vector<Account*>();
-Account::Account(string n) : campaignProgress() {
- name = string(n);
- difficulty = 0;
- progress = 0;
- points = 0;
- memset(highscore, 0, sizeof(highscore));
- memset(fasttime, 0, sizeof(fasttime));
- memset(unlocked, 0, sizeof(unlocked));
-
- setCurrentCampaign("main");
+Account::Account(string n) : campaignProgress()
+{
+ name = string(n);
+ difficulty = 0;
+ progress = 0;
+ points = 0;
+ memset(highscore, 0, sizeof(highscore));
+ memset(fasttime, 0, sizeof(fasttime));
+ memset(unlocked, 0, sizeof(unlocked));
+
+ setCurrentCampaign("main");
}
-void Account::setCurrentCampaign(string name) {
- currentCampaign = name;
+void Account::setCurrentCampaign(string name)
+{
+ currentCampaign = name;
}
-Account* Account::add(string name) {
- accounts.push_back(new Account(name));
- return accounts.back();
+Account* Account::add(string name)
+{
+ accounts.push_back(new Account(name));
+ return accounts.back();
}
-Account* Account::get(int i) {
-
- if((i>=0)&&(i<accounts.size())) {
- return accounts[i];
- } else
- return NULL;
+Account* Account::get(int i)
+{
+
+ if ((i >= 0) && (i < accounts.size())) {
+ return accounts[i];
+ } else
+ return NULL;
}
-void Account::destroy(int i) {
- accounts.erase(accounts.begin()+i);
+void Account::destroy(int i)
+{
+ accounts.erase(accounts.begin() + i);
}
-Account* Account::destroy(Account* a) {
- for(int i=0; i<accounts.size(); i++) {
- if(accounts[i]==a) {
- accounts.erase(accounts.begin()+i);
- return NULL;
- }
- }
- printf("Unexpected error : User %s not found\n",a->getName());
- return accounts.front();
+Account* Account::destroy(Account* a)
+{
+ for (int i = 0; i < accounts.size(); i++) {
+ if (accounts[i] == a) {
+ accounts.erase(accounts.begin() + i);
+ return NULL;
+ }
+ }
+ printf("Unexpected error : User %s not found\n", a->getName());
+ return accounts.front();
}
-int Account::getDifficulty() {
- return difficulty;
+int Account::getDifficulty()
+{
+ return difficulty;
}
-void Account::endGame() {
- campaignProgress[currentCampaign].choices.clear();
- campaignProgress[currentCampaign].score=0;
- campaignProgress[currentCampaign].time=0;
+void Account::endGame()
+{
+ campaignProgress[currentCampaign].choices.clear();
+ campaignProgress[currentCampaign].score = 0;
+ campaignProgress[currentCampaign].time = 0;
}
-void Account::winCampaignLevel(int choice, float score, float time) {
- campaignProgress[currentCampaign].choices.push_back(choice);
- setCampaignScore(campaignProgress[currentCampaign].score+score);
- campaignProgress[currentCampaign].time = time;
+void Account::winCampaignLevel(int choice, float score, float time)
+{
+ campaignProgress[currentCampaign].choices.push_back(choice);
+ setCampaignScore(campaignProgress[currentCampaign].score + score);
+ campaignProgress[currentCampaign].time = time;
}
-void Account::winLevel(int level, float score, float time) {
- if(!debugmode) {
- if(score>highscore[level])
- highscore[level]=score;
- if(time<fasttime[level]||fasttime[level]==0)
- fasttime[level]=time;
- }
- if(progress<level+1)
- progress=level+1;
+void Account::winLevel(int level, float score, float time)
+{
+ if (!debugmode) {
+ if (score > highscore[level])
+ highscore[level] = score;
+ if (time < fasttime[level] || fasttime[level] == 0)
+ fasttime[level] = time;
+ }
+ if (progress < level + 1)
+ progress = level + 1;
}
-Account* Account::loadFile(string filename) {
- FILE *tfile;
- int numaccounts;
- int accountactive;
-
- tfile=fopen(ConvertFileName(filename.c_str()), "rb" );
-
- if(tfile)
- {
- funpackf(tfile, "Bi", &numaccounts);
- funpackf(tfile, "Bi", &accountactive);
- printf("number of accounts %d\n",numaccounts);
- for(int i=0;i<numaccounts;i++)
- {
- printf("loading account %d/%d\n",i,numaccounts);
- Account* acc = new Account();
- funpackf(tfile, "Bi", &(acc->difficulty));
- funpackf(tfile, "Bi", &(acc->progress));
- int nbCampaigns;
- funpackf(tfile, "Bi", &nbCampaigns);
- //~ printf("loading %d campaign progress info\n",nbCampaigns);
-
- for(int k=0;k<nbCampaigns;++k) {
- string campaignName = "";
- int t;
- char c;
- funpackf(tfile, "Bi", &t);
- for(int j=0;j<t;j++)
- {
- funpackf(tfile, "Bb", &c);
- campaignName.append(1,c);
- }
- //~ printf("loading %s campaign progress info\n",campaignName.c_str());
- funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].time));
- funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].score));
- funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].fasttime));
- funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].highscore));
- int campaignchoicesmade,campaignchoice;
- funpackf(tfile, "Bi", &campaignchoicesmade);
- for(int j=0;j<campaignchoicesmade;j++)
- {
- funpackf(tfile, "Bi", &campaignchoice);
- if (campaignchoice >= 10) // what is that for?
- {
- campaignchoice = 0;
- }
- acc->campaignProgress[campaignName].choices.push_back(campaignchoice);
- }
- }
-
- acc->currentCampaign = "";
- int t;
- char c;
- funpackf(tfile, "Bi", &t);
- for(int i=0;i<t;i++)
- {
- funpackf(tfile, "Bb", &c);
- acc->currentCampaign.append(1,c);
- }
-
- funpackf(tfile, "Bf", &(acc->points));
- for(int i=0;i<50;i++)
- {
- funpackf(tfile, "Bf", &(acc->highscore[i]));
- funpackf(tfile, "Bf", &(acc->fasttime[i]));
- }
- for(int i=0;i<60;i++)
- {
- funpackf(tfile, "Bb", &(acc->unlocked[i]));
- }
- int temp;
- char ctemp;
- funpackf(tfile, "Bi", &temp);
- for(int i=0;i<temp;i++)
- {
- funpackf(tfile, "Bb", &ctemp);
- acc->name.append(1,ctemp);
- }
- if(!strcmp(acc->name.c_str(),""))
- acc->name="Lugaru Player"; // no empty player name security.
- accounts.push_back(acc);
- }
-
- fclose(tfile);
- return get(accountactive);
- } else {
- printf("filenotfound\n");
- return NULL;
- }
+Account* Account::loadFile(string filename)
+{
+ FILE *tfile;
+ int numaccounts;
+ int accountactive;
+
+ tfile = fopen(ConvertFileName(filename.c_str()), "rb" );
+
+ if (tfile) {
+ funpackf(tfile, "Bi", &numaccounts);
+ funpackf(tfile, "Bi", &accountactive);
+ printf("number of accounts %d\n", numaccounts);
+ for (int i = 0; i < numaccounts; i++) {
+ printf("loading account %d/%d\n", i, numaccounts);
+ Account* acc = new Account();
+ funpackf(tfile, "Bi", &(acc->difficulty));
+ funpackf(tfile, "Bi", &(acc->progress));
+ int nbCampaigns;
+ funpackf(tfile, "Bi", &nbCampaigns);
+ //~ printf("loading %d campaign progress info\n",nbCampaigns);
+
+ for (int k = 0; k < nbCampaigns; ++k) {
+ string campaignName = "";
+ int t;
+ char c;
+ funpackf(tfile, "Bi", &t);
+ for (int j = 0; j < t; j++) {
+ funpackf(tfile, "Bb", &c);
+ campaignName.append(1, c);
+ }
+ //~ printf("loading %s campaign progress info\n",campaignName.c_str());
+ funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].time));
+ funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].score));
+ funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].fasttime));
+ funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].highscore));
+ int campaignchoicesmade, campaignchoice;
+ funpackf(tfile, "Bi", &campaignchoicesmade);
+ for (int j = 0; j < campaignchoicesmade; j++) {
+ funpackf(tfile, "Bi", &campaignchoice);
+ if (campaignchoice >= 10) { // what is that for?
+ campaignchoice = 0;
+ }
+ acc->campaignProgress[campaignName].choices.push_back(campaignchoice);
+ }
+ }
+
+ acc->currentCampaign = "";
+ int t;
+ char c;
+ funpackf(tfile, "Bi", &t);
+ for (int i = 0; i < t; i++) {
+ funpackf(tfile, "Bb", &c);
+ acc->currentCampaign.append(1, c);
+ }
+
+ funpackf(tfile, "Bf", &(acc->points));
+ for (int i = 0; i < 50; i++) {
+ funpackf(tfile, "Bf", &(acc->highscore[i]));
+ funpackf(tfile, "Bf", &(acc->fasttime[i]));
+ }
+ for (int i = 0; i < 60; i++) {
+ funpackf(tfile, "Bb", &(acc->unlocked[i]));
+ }
+ int temp;
+ char ctemp;
+ funpackf(tfile, "Bi", &temp);
+ for (int i = 0; i < temp; i++) {
+ funpackf(tfile, "Bb", &ctemp);
+ acc->name.append(1, ctemp);
+ }
+ if (!strcmp(acc->name.c_str(), ""))
+ acc->name = "Lugaru Player"; // no empty player name security.
+ accounts.push_back(acc);
+ }
+
+ fclose(tfile);
+ return get(accountactive);
+ } else {
+ printf("filenotfound\n");
+ return NULL;
+ }
}
-void Account::saveFile(string filename, Account* accountactive) {
- FILE *tfile;
- int j;
-
- tfile=fopen(ConvertFileName(filename.c_str(), "wb"), "wb" );
- if(tfile)
- {
- printf("writing %d accounts :\n",getNbAccounts());
- fpackf(tfile, "Bi", getNbAccounts());
- fpackf(tfile, "Bi", indice(accountactive));
-
- for(int i=0;i<getNbAccounts();i++)
- {
- Account* a = Account::get(i);
- printf("writing account %d/%d (%s)\n",i+1,getNbAccounts(),a->getName());
- fpackf(tfile, "Bi", a->difficulty);
- fpackf(tfile, "Bi", a->progress);
- fpackf(tfile, "Bi", a->campaignProgress.size());
-
- map<string,CampaignProgress>::const_iterator it;
- for( it=a->campaignProgress.begin(); it!= a->campaignProgress.end(); ++it) {
- fpackf(tfile, "Bi", it->first.size());
- for(j=0;j<it->first.size();j++)
- {
- fpackf(tfile, "Bb", it->first[j]);
- }
- fpackf(tfile, "Bf", it->second.time);
- fpackf(tfile, "Bf", it->second.score);
- fpackf(tfile, "Bf", it->second.fasttime);
- fpackf(tfile, "Bf", it->second.highscore);
- fpackf(tfile, "Bi", it->second.choices.size());
- for(j=0;j<it->second.choices.size();j++)
- {
- fpackf(tfile, "Bi", it->second.choices[j]);
- }
- }
-
- fpackf(tfile, "Bi", a->getCurrentCampaign().size());
- for(j=0;j<a->getCurrentCampaign().size();j++)
- {
- fpackf(tfile, "Bb", a->getCurrentCampaign()[j]);
- }
-
- fpackf(tfile, "Bf", a->points);
- for(j=0;j<50;j++)
- {
- fpackf(tfile, "Bf", a->highscore[j]);
- fpackf(tfile, "Bf", a->fasttime[j]);
- }
- for(j=0;j<60;j++)
- {
- fpackf(tfile, "Bb", a->unlocked[j]);
- }
- fpackf(tfile, "Bi", a->name.size());
- for(j=0;j<a->name.size();j++)
- {
- fpackf(tfile, "Bb", a->name[j]);
- }
- }
-
- fclose(tfile);
- }
+void Account::saveFile(string filename, Account* accountactive)
+{
+ FILE *tfile;
+ int j;
+
+ tfile = fopen(ConvertFileName(filename.c_str(), "wb"), "wb" );
+ if (tfile) {
+ printf("writing %d accounts :\n", getNbAccounts());
+ fpackf(tfile, "Bi", getNbAccounts());
+ fpackf(tfile, "Bi", indice(accountactive));
+
+ for (int i = 0; i < getNbAccounts(); i++) {
+ Account* a = Account::get(i);
+ printf("writing account %d/%d (%s)\n", i + 1, getNbAccounts(), a->getName());
+ fpackf(tfile, "Bi", a->difficulty);
+ fpackf(tfile, "Bi", a->progress);
+ fpackf(tfile, "Bi", a->campaignProgress.size());
+
+ map<string, CampaignProgress>::const_iterator it;
+ for ( it = a->campaignProgress.begin(); it != a->campaignProgress.end(); ++it) {
+ fpackf(tfile, "Bi", it->first.size());
+ for (j = 0; j < it->first.size(); j++) {
+ fpackf(tfile, "Bb", it->first[j]);
+ }
+ fpackf(tfile, "Bf", it->second.time);
+ fpackf(tfile, "Bf", it->second.score);
+ fpackf(tfile, "Bf", it->second.fasttime);
+ fpackf(tfile, "Bf", it->second.highscore);
+ fpackf(tfile, "Bi", it->second.choices.size());
+ for (j = 0; j < it->second.choices.size(); j++) {
+ fpackf(tfile, "Bi", it->second.choices[j]);
+ }
+ }
+
+ fpackf(tfile, "Bi", a->getCurrentCampaign().size());
+ for (j = 0; j < a->getCurrentCampaign().size(); j++) {
+ fpackf(tfile, "Bb", a->getCurrentCampaign()[j]);
+ }
+
+ fpackf(tfile, "Bf", a->points);
+ for (j = 0; j < 50; j++) {
+ fpackf(tfile, "Bf", a->highscore[j]);
+ fpackf(tfile, "Bf", a->fasttime[j]);
+ }
+ for (j = 0; j < 60; j++) {
+ fpackf(tfile, "Bb", a->unlocked[j]);
+ }
+ fpackf(tfile, "Bi", a->name.size());
+ for (j = 0; j < a->name.size(); j++) {
+ fpackf(tfile, "Bb", a->name[j]);
+ }
+ }
+
+ fclose(tfile);
+ }
}
-int Account::indice(Account* a) {
- for(int i=0; i < accounts.size(); i++) {
- if(accounts[i]==a)
- return i;
- }
- return -1;
+int Account::indice(Account* a)
+{
+ for (int i = 0; i < accounts.size(); i++) {
+ if (accounts[i] == a)
+ return i;
+ }
+ return -1;
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#include <fstream>
struct CampaignProgress {
- float highscore;
- float fasttime;
- float score;
- float time;
- std::vector<int> choices;
- CampaignProgress() {
- highscore = 0;
- fasttime = 0;
- score = 0;
- time = 0;
- }
+ float highscore;
+ float fasttime;
+ float score;
+ float time;
+ std::vector<int> choices;
+ CampaignProgress() {
+ highscore = 0;
+ fasttime = 0;
+ score = 0;
+ time = 0;
+ }
};
-class Account {
- public:
- static void destroy(int i);
- static Account* destroy(Account* a);
- static Account* add(std::string name);
- static Account* get(int i);
- static Account* loadFile(std::string filename);
- static void saveFile(std::string filename, Account* accountactive);
- static int indice(Account* a);
-
- void endGame();
- void winCampaignLevel(int choice, float score, float time);
- void winLevel(int level, float score, float time);
-
- // getter and setters
- int getDifficulty();
- void setDifficulty(int i) { difficulty = i; };
- const char* getName() { return name.c_str(); };
- float getCampaignScore() { return campaignProgress[currentCampaign].score; };
- int getCampaignChoicesMade() { return campaignProgress[currentCampaign].choices.size(); };
- int getCampaignChoice(int i) { return campaignProgress[currentCampaign].choices[i]; };
- void setCampaignScore(int s) {
- campaignProgress[currentCampaign].score=s;
- if(s>campaignProgress[currentCampaign].highscore)
- campaignProgress[currentCampaign].highscore=s;
- };
- void setCampaignFinalTime(float t) {
- campaignProgress[currentCampaign].time = t;
- if((t<campaignProgress[currentCampaign].fasttime) || (campaignProgress[currentCampaign].fasttime==0) && (t!=0))
- campaignProgress[currentCampaign].fasttime = t;
- };
- float getCampaignFasttime() { return campaignProgress[currentCampaign].fasttime; };
- void resetFasttime() { campaignProgress[currentCampaign].fasttime = 0; };
- float getCampaignHighScore() { return campaignProgress[currentCampaign].highscore; };
- float getHighScore(int i) { return highscore[i]; };
- float getFastTime(int i) { return fasttime[i]; };
- int getProgress() { return progress; };
- std::string getCurrentCampaign() { return currentCampaign; };
- void setCurrentCampaign(std::string name);
-
- static int getNbAccounts() { return accounts.size(); };
- private:
- Account(std::string n="");
- int difficulty;
- int progress; // progress in challenge levels
- float points;
- float highscore[50];
- float fasttime[50];
- bool unlocked[60];
- std::string name;
-
- std::string currentCampaign;
- std::map<std::string,CampaignProgress> campaignProgress;
-
- //statics
- static std::vector<Account*> accounts;
+class Account
+{
+public:
+ static void destroy(int i);
+ static Account* destroy(Account* a);
+ static Account* add(std::string name);
+ static Account* get(int i);
+ static Account* loadFile(std::string filename);
+ static void saveFile(std::string filename, Account* accountactive);
+ static int indice(Account* a);
+
+ void endGame();
+ void winCampaignLevel(int choice, float score, float time);
+ void winLevel(int level, float score, float time);
+
+ // getter and setters
+ int getDifficulty();
+ void setDifficulty(int i) {
+ difficulty = i;
+ };
+ const char* getName() {
+ return name.c_str();
+ };
+ float getCampaignScore() {
+ return campaignProgress[currentCampaign].score;
+ };
+ int getCampaignChoicesMade() {
+ return campaignProgress[currentCampaign].choices.size();
+ };
+ int getCampaignChoice(int i) {
+ return campaignProgress[currentCampaign].choices[i];
+ };
+ void setCampaignScore(int s) {
+ campaignProgress[currentCampaign].score = s;
+ if (s > campaignProgress[currentCampaign].highscore)
+ campaignProgress[currentCampaign].highscore = s;
+ };
+ void setCampaignFinalTime(float t) {
+ campaignProgress[currentCampaign].time = t;
+ if ((t < campaignProgress[currentCampaign].fasttime) || (campaignProgress[currentCampaign].fasttime == 0) && (t != 0))
+ campaignProgress[currentCampaign].fasttime = t;
+ };
+ float getCampaignFasttime() {
+ return campaignProgress[currentCampaign].fasttime;
+ };
+ void resetFasttime() {
+ campaignProgress[currentCampaign].fasttime = 0;
+ };
+ float getCampaignHighScore() {
+ return campaignProgress[currentCampaign].highscore;
+ };
+ float getHighScore(int i) {
+ return highscore[i];
+ };
+ float getFastTime(int i) {
+ return fasttime[i];
+ };
+ int getProgress() {
+ return progress;
+ };
+ std::string getCurrentCampaign() {
+ return currentCampaign;
+ };
+ void setCurrentCampaign(std::string name);
+
+ static int getNbAccounts() {
+ return accounts.size();
+ };
+private:
+ Account(std::string n = "");
+ int difficulty;
+ int progress; // progress in challenge levels
+ float points;
+ float highscore[50];
+ float fasttime[50];
+ bool unlocked[60];
+ std::string name;
+
+ std::string currentCampaign;
+ std::map<std::string, CampaignProgress> campaignProgress;
+
+ //statics
+ static std::vector<Account*> accounts;
};
#endif
#include "Skeleton.h"
#include "Animation.h"
-struct animation_data_elt
-{
- const char *filename;
- int height;
- int attack;
+struct animation_data_elt {
+ const char *filename;
+ int height;
+ int attack;
};
static animation_data_elt animation_data[animation_count] = {
void loadAllAnimations()
{
- for (int i = 0; i < loadable_anim_end; i++)
- {
- animation_data_elt *e = animation_data + i;
- animation[i].Load(e->filename, e->height, e->attack);
+ for (int i = 0; i < loadable_anim_end; i++) {
+ animation_data_elt *e = animation_data + i;
+ animation[i].Load(e->filename, e->height, e->attack);
}
}
#define ANIMATION_H
enum anim_attack_type {
- neutral, normalattack, reversed, reversal
+ neutral, normalattack, reversed, reversal
};
enum anim_height_type {
- lowheight, middleheight, highheight
+ lowheight, middleheight, highheight
};
#define DECLARE_ANIM(id, ...) id,
#include "Animation.def"
#undef DECLARE_ANIM
-animation_count
+ animation_count
};
enum animation_bit_offsets {
#define DECLARE_ANIM_BIT(bit) o_##bit,
#include "Animation.def"
#undef DECLARE_ANIM_BIT
-animation_bit_count
+ animation_bit_count
};
enum animation_bits_def {
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];
+ if (playerid != 0)
+ return;
+ bonus = bonusid;
+ bonustime = 0;
+ bonusvalue = alt_value ? alt_value : bonus_values[bonusid];
}
// FIXME: make these per-player
int award_awards(int *awards)
{
- int numawards = 0, i;
- if(damagetaken==0&&player[0].bloodloss==0){
- awards[numawards]=awardflawless;
- numawards++;
- }
- bool alldead = true;
- for(i=1;i<numplayers;i++){
- if(player[i].dead!=2)alldead=0;
- }
- if(alldead){
- awards[numawards]=awardalldead;
- numawards++;
- }
- alldead=1;
- for(i=1;i<numplayers;i++){
- if(player[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==numplayers-1){
- awards[numawards]=awardlongrange;
- numawards++;
- }
- alldead=1;
- for(i=1;i<numplayers;i++){
- if(player[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&&numplayers>2){
- awards[numawards]=awardstrategy;
- numawards++;
- }
- if(numflipfail>3){
- awards[numawards]=awardklutz;
- numawards++;
- }
- return numawards;
+ int numawards = 0, i;
+ if (damagetaken == 0 && player[0].bloodloss == 0) {
+ awards[numawards] = awardflawless;
+ numawards++;
+ }
+ bool alldead = true;
+ for (i = 1; i < numplayers; i++) {
+ if (player[i].dead != 2)alldead = 0;
+ }
+ if (alldead) {
+ awards[numawards] = awardalldead;
+ numawards++;
+ }
+ alldead = 1;
+ for (i = 1; i < numplayers; i++) {
+ if (player[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 == numplayers - 1) {
+ awards[numawards] = awardlongrange;
+ numawards++;
+ }
+ alldead = 1;
+ for (i = 1; i < numplayers; i++) {
+ if (player[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 && numplayers > 2) {
+ awards[numawards] = awardstrategy;
+ numawards++;
+ }
+ if (numflipfail > 3) {
+ awards[numawards] = awardklutz;
+ numawards++;
+ }
+ return numawards;
}
#define DECLARE_BONUS(id, ...) id,
#include "Bonuses.def"
#undef DECLARE_BONUS
-bonus_count
+ bonus_count
};
static const char *bonus_names[bonus_count] = {
#define DECLARE_AWARD(id, name) id,
#include "Awards.def"
#undef DECLARE_AWARD
-award_count
+ award_count
};
static const char *award_names[award_count] = {
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
void FRUSTUM::
- GetFrustum() {
- static float projmatrix[16];
- static float mvmatrix[16];
- static float clip[16];
-
- glGetFloatv(GL_PROJECTION_MATRIX, projmatrix);
- glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix);
-
- // Combine the matrices
- clip[0] = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12];
- clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13];
- clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14];
- clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15];
-
- clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12];
- clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13];
- clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14];
- clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15];
-
- clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12];
- clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13];
- clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14];
- clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15];
-
- clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12];
- clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13];
- clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14];
- clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15];
-
- // Right plane
- frustum[0][0] = clip[3] - clip[0];
- frustum[0][1] = clip[7] - clip[4];
- frustum[0][2] = clip[11] - clip[8];
- frustum[0][3] = clip[15] - clip[12];
-
- // Left plane
- frustum[1][0] = clip[3] + clip[0];
- frustum[1][1] = clip[7] + clip[4];
- frustum[1][2] = clip[11] + clip[8];
- frustum[1][3] = clip[15] + clip[12];
-
- // Bottom plane
- frustum[2][0] = clip[3] + clip[1];
- frustum[2][1] = clip[7] + clip[5];
- frustum[2][2] = clip[11] + clip[9];
- frustum[2][3] = clip[15] + clip[13];
-
- // Top plane
- frustum[3][0] = clip[3] - clip[1];
- frustum[3][1] = clip[7] - clip[5];
- frustum[3][2] = clip[11] - clip[9];
- frustum[3][3] = clip[15] - clip[13];
-
- // Far plane
- frustum[4][0] = clip[3] - clip[2];
- frustum[4][1] = clip[7] - clip[6];
- frustum[4][2] = clip[11] - clip[10];
- frustum[4][3] = clip[15] - clip[14];
-
- // Near plane
- frustum[5][0] = clip[3] + clip[2];
- frustum[5][1] = clip[7] + clip[6];
- frustum[5][2] = clip[11] + clip[10];
- frustum[5][3] = clip[15] + clip[14];
+GetFrustum()
+{
+ static float projmatrix[16];
+ static float mvmatrix[16];
+ static float clip[16];
+
+ glGetFloatv(GL_PROJECTION_MATRIX, projmatrix);
+ glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix);
+
+ // Combine the matrices
+ clip[0] = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12];
+ clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13];
+ clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14];
+ clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15];
+
+ clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12];
+ clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13];
+ clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14];
+ clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15];
+
+ clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12];
+ clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13];
+ clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14];
+ clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15];
+
+ clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12];
+ clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13];
+ clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14];
+ clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15];
+
+ // Right plane
+ frustum[0][0] = clip[3] - clip[0];
+ frustum[0][1] = clip[7] - clip[4];
+ frustum[0][2] = clip[11] - clip[8];
+ frustum[0][3] = clip[15] - clip[12];
+
+ // Left plane
+ frustum[1][0] = clip[3] + clip[0];
+ frustum[1][1] = clip[7] + clip[4];
+ frustum[1][2] = clip[11] + clip[8];
+ frustum[1][3] = clip[15] + clip[12];
+
+ // Bottom plane
+ frustum[2][0] = clip[3] + clip[1];
+ frustum[2][1] = clip[7] + clip[5];
+ frustum[2][2] = clip[11] + clip[9];
+ frustum[2][3] = clip[15] + clip[13];
+
+ // Top plane
+ frustum[3][0] = clip[3] - clip[1];
+ frustum[3][1] = clip[7] - clip[5];
+ frustum[3][2] = clip[11] - clip[9];
+ frustum[3][3] = clip[15] - clip[13];
+
+ // Far plane
+ frustum[4][0] = clip[3] - clip[2];
+ frustum[4][1] = clip[7] - clip[6];
+ frustum[4][2] = clip[11] - clip[10];
+ frustum[4][3] = clip[15] - clip[14];
+
+ // Near plane
+ frustum[5][0] = clip[3] + clip[2];
+ frustum[5][1] = clip[7] + clip[6];
+ frustum[5][2] = clip[11] + clip[10];
+ frustum[5][3] = clip[15] + clip[14];
}
int FRUSTUM::
- CubeInFrustum(float x, float y, float z, float size) {
- static int c, c2;
-
- for(int i=0; i<6; i++) {
- c=0;
- if(frustum[i][0] * (x-size) + frustum[i][1] * (y-size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x+size) + frustum[i][1] * (y-size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x-size) + frustum[i][1] * (y+size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x+size) + frustum[i][1] * (y+size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x-size) + frustum[i][1] * (y-size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x+size) + frustum[i][1] * (y-size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x-size) + frustum[i][1] * (y+size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x+size) + frustum[i][1] * (y+size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
- c++;
- if(c==0)
- return 0;
- if(c==8)
- c2++;
- }
- if(c2>=6)
- return 2;
- else
- return 1;
+CubeInFrustum(float x, float y, float z, float size)
+{
+ static int c, c2;
+
+ for (int i = 0; i < 6; i++) {
+ c = 0;
+ if (frustum[i][0] * (x - size) + frustum[i][1] * (y - size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x + size) + frustum[i][1] * (y - size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x - size) + frustum[i][1] * (y + size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x + size) + frustum[i][1] * (y + size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x - size) + frustum[i][1] * (y - size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x + size) + frustum[i][1] * (y - size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x - size) + frustum[i][1] * (y + size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x + size) + frustum[i][1] * (y + size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+ c++;
+ if (c == 0)
+ return 0;
+ if (c == 8)
+ c2++;
+ }
+ if (c2 >= 6)
+ return 2;
+ else
+ return 1;
}
int FRUSTUM::
- CubeInFrustum(float x, float y, float z, float size, float height) {
- static int c, c2;
-
- for(int i=0; i<6; i++) {
- c=0;
- if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
- c++;
- if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
- c++;
- if(c==0)
- return 0;
- if(c==8)
- c2++;
- }
- if(c2>=6)
- return 2;
- else
- return 1;
+CubeInFrustum(float x, float y, float z, float size, float height)
+{
+ static int c, c2;
+
+ for (int i = 0; i < 6; i++) {
+ c = 0;
+ if (frustum[i][0] * (x - size) + frustum[i][1] * (y - height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x + size) + frustum[i][1] * (y - height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x - size) + frustum[i][1] * (y + height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x + size) + frustum[i][1] * (y + height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x - size) + frustum[i][1] * (y - height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x + size) + frustum[i][1] * (y - height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x - size) + frustum[i][1] * (y + height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+ c++;
+ if (frustum[i][0] * (x + size) + frustum[i][1] * (y + height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+ c++;
+ if (c == 0)
+ return 0;
+ if (c == 8)
+ c2++;
+ }
+ if (c2 >= 6)
+ return 2;
+ else
+ return 1;
}
int FRUSTUM::
- SphereInFrustum(float x, float y, float z, float radius) {
- static int c2;
-
- for(int i=0; i<6; i++) {
- if(frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1*radius)
- c2++;
- else
- return 0;
- }
- if(c2>=6)
- return 2;
- else
- return 1;
+SphereInFrustum(float x, float y, float z, float radius)
+{
+ static int c2;
+
+ for (int i = 0; i < 6; i++) {
+ if (frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1 * radius)
+ c2++;
+ else
+ return 0;
+ }
+ if (c2 >= 6)
+ return 2;
+ else
+ return 1;
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#ifndef FRUSTUM_H
#define FRUSTUM_H
-class FRUSTUM {
+class FRUSTUM
+{
public:
- float frustum[6][4];
- void GetFrustum();
- int CubeInFrustum(float, float, float, float);
- int CubeInFrustum(float, float, float, float, float);
- int SphereInFrustum(float, float, float, float);
+ float frustum[6][4];
+ void GetFrustum();
+ int CubeInFrustum(float, float, float, float);
+ int CubeInFrustum(float, float, float, float, float);
+ int SphereInFrustum(float, float, float, float);
};
#endif
float dialoguetime;
int dialoguegonethrough[20];
-namespace Game{
- Texture terraintexture;
- Texture terraintexture2;
- Texture loadscreentexture;
- Texture Maparrowtexture;
- Texture Mapboxtexture;
- Texture Mapcircletexture;
- Texture cursortexture;
- GLuint screentexture = 0;
- GLuint screentexture2 = 0;
- Texture Mainmenuitems[10];
+namespace Game
+{
+Texture terraintexture;
+Texture terraintexture2;
+Texture loadscreentexture;
+Texture Maparrowtexture;
+Texture Mapboxtexture;
+Texture Mapcircletexture;
+Texture cursortexture;
+GLuint screentexture = 0;
+GLuint screentexture2 = 0;
+Texture Mainmenuitems[10];
- int selected = 0;
- int keyselect = 0;
+int selected = 0;
+int keyselect = 0;
- int newdetail = 0;
- int newscreenwidth = 0;
- int newscreenheight = 0;
+int newdetail = 0;
+int newscreenwidth = 0;
+int newscreenheight = 0;
- bool gameon = 0;
- float deltah = 0;
- float deltav = 0;
- int mousecoordh = 0;
- int mousecoordv = 0;
- int oldmousecoordh = 0;
- int oldmousecoordv = 0;
- float yaw = 0;
- float pitch = 0;
- SkyBox *skybox = NULL;
- bool cameramode = 0;
- bool firstload = 0;
+bool gameon = 0;
+float deltah = 0;
+float deltav = 0;
+int mousecoordh = 0;
+int mousecoordv = 0;
+int oldmousecoordh = 0;
+int oldmousecoordv = 0;
+float yaw = 0;
+float pitch = 0;
+SkyBox *skybox = NULL;
+bool cameramode = 0;
+bool firstload = 0;
- Texture hawktexture;
- float hawkyaw = 0;
- float hawkcalldelay = 0;
- float leveltime = 0;
- float loadtime = 0;
+Texture hawktexture;
+float hawkyaw = 0;
+float hawkcalldelay = 0;
+float leveltime = 0;
+float loadtime = 0;
- Model hawk;
- XYZ hawkcoords;
- XYZ realhawkcoords;
+Model hawk;
+XYZ hawkcoords;
+XYZ realhawkcoords;
- Model eye;
- Model iris;
- Model cornea;
+Model eye;
+Model iris;
+Model cornea;
- bool stealthloading = 0;
+bool stealthloading = 0;
- int musictype = 0;
+int musictype = 0;
- XYZ mapcenter;
- float mapradius = 0;
+XYZ mapcenter;
+float mapradius = 0;
- Text *text = NULL;
- float fps = 0;
+Text *text = NULL;
+float fps = 0;
- bool editorenabled = 0;
- int editortype = 0;
- float editorsize = 0;
- float editoryaw = 0;
- float editorpitch = 0;
+bool editorenabled = 0;
+int editortype = 0;
+float editorsize = 0;
+float editoryaw = 0;
+float editorpitch = 0;
- int tryquit = 0;
+int tryquit = 0;
- XYZ pathpoint[30];
- int numpathpoints = 0;
- int numpathpointconnect[30] = {};
- int pathpointconnect[30][30] = {};
- int pathpointselected = 0;
+XYZ pathpoint[30];
+int numpathpoints = 0;
+int numpathpointconnect[30] = {};
+int pathpointconnect[30][30] = {};
+int pathpointselected = 0;
- int endgame = 0;
- bool scoreadded = 0;
- int numchallengelevels = 0;
+int endgame = 0;
+bool scoreadded = 0;
+int numchallengelevels = 0;
- bool console = false;
- char consoletext[15][256] = {};
- int consolechars[15] = {};
- bool chatting = 0;
- char displaytext[15][256] = {};
- int displaychars[15] = {};
- float displaytime[15] = {};
- float displayblinkdelay = 0;
- bool displayblink = 0;
- int displayselected = 0;
- float consoleblinkdelay = 0;
- bool consoleblink = 0;
- int consoleselected = 0;
+bool console = false;
+char consoletext[15][256] = {};
+int consolechars[15] = {};
+bool chatting = 0;
+char displaytext[15][256] = {};
+int displaychars[15] = {};
+float displaytime[15] = {};
+float displayblinkdelay = 0;
+bool displayblink = 0;
+int displayselected = 0;
+float consoleblinkdelay = 0;
+bool consoleblink = 0;
+int consoleselected = 0;
- unsigned short crouchkey=0,jumpkey=0,forwardkey=0,chatkey=0,backkey=0,leftkey=0,rightkey=0,drawkey=0,throwkey=0,attackkey=0;
- unsigned short consolekey=0;
+unsigned short crouchkey = 0, jumpkey = 0, forwardkey = 0, chatkey = 0, backkey = 0, leftkey = 0, rightkey = 0, drawkey = 0, throwkey = 0, attackkey = 0;
+unsigned short consolekey = 0;
- int loading = 0;
-
- int oldenvironment = 0;
- int targetlevel = 0;
- float changedelay = 0;
+int loading = 0;
- bool waiting = false;
- Account* accountactive = NULL;
+int oldenvironment = 0;
+int targetlevel = 0;
+float changedelay = 0;
+
+bool waiting = false;
+Account* accountactive = NULL;
}
-void Game::fireSound(int sound) {
- emit_sound_at(sound);
+void Game::fireSound(int sound)
+{
+ emit_sound_at(sound);
}
-void Game::inputText(char* str, int* charselected, int* nb_chars) {
- SDL_Event evenement;
-
- if(!waiting) {
- waiting=true;
- SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
- SDL_EnableUNICODE(true);
- }
+void Game::inputText(char* str, int* charselected, int* nb_chars)
+{
+ SDL_Event evenement;
+
+ if (!waiting) {
+ waiting = true;
+ SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
+ SDL_EnableUNICODE(true);
+ }
- while(SDL_PollEvent(&evenement)) {
-
- switch(evenement.type) {
- case SDL_KEYDOWN:
- if(evenement.key.keysym.sym == SDLK_ESCAPE) {
- for(int i=0;i<255;i++)
- str[i]=0;
- *nb_chars=0;
- *charselected=0;
- waiting=false;
- } else if(evenement.key.keysym.sym==SDLK_BACKSPACE){
- if((*charselected)!=0) {
- for(int i=(*charselected)-1;i<255;i++)
- str[i]=str[i+1];
- str[255]=0;
- (*charselected)--;
- (*nb_chars)--;
- }
- } else if(evenement.key.keysym.sym==SDLK_DELETE){
- if((*charselected)<(*nb_chars)){
- for(int i=(*charselected);i<255;i++)
- str[i]=str[i+1];
- str[255]=0;
- (*nb_chars)--;
- }
- } else if(evenement.key.keysym.sym==SDLK_HOME){
- (*charselected)=0;
- } else if(evenement.key.keysym.sym==SDLK_END){
- (*charselected)=(*nb_chars);
- } else if(evenement.key.keysym.sym==SDLK_LEFT){
- if((*charselected)!=0)
- (*charselected)--;
- } else if(evenement.key.keysym.sym==SDLK_RIGHT){
- if((*charselected)<(*nb_chars))
- (*charselected)++;
- } else if(evenement.key.keysym.sym==SDLK_RETURN) {
- waiting=false;
- } else if(evenement.key.keysym.unicode>=32&&evenement.key.keysym.unicode<127&&(*nb_chars)<60){
- for(int i=255;i>=(*charselected)+1;i--)
- str[i]=str[i-1];
- str[*charselected]=evenement.key.keysym.unicode;
- (*charselected)++;
- (*nb_chars)++;
- }
- break;
- }
- }
-
- if(!waiting) {
- SDL_EnableKeyRepeat(0,0); // disable key repeat
- SDL_EnableUNICODE(false);
- }
+ while (SDL_PollEvent(&evenement)) {
+
+ switch (evenement.type) {
+ case SDL_KEYDOWN:
+ if (evenement.key.keysym.sym == SDLK_ESCAPE) {
+ for (int i = 0; i < 255; i++)
+ str[i] = 0;
+ *nb_chars = 0;
+ *charselected = 0;
+ waiting = false;
+ } else if (evenement.key.keysym.sym == SDLK_BACKSPACE) {
+ if ((*charselected) != 0) {
+ for (int i = (*charselected) - 1; i < 255; i++)
+ str[i] = str[i + 1];
+ str[255] = 0;
+ (*charselected)--;
+ (*nb_chars)--;
+ }
+ } else if (evenement.key.keysym.sym == SDLK_DELETE) {
+ if ((*charselected) < (*nb_chars)) {
+ for (int i = (*charselected); i < 255; i++)
+ str[i] = str[i + 1];
+ str[255] = 0;
+ (*nb_chars)--;
+ }
+ } else if (evenement.key.keysym.sym == SDLK_HOME) {
+ (*charselected) = 0;
+ } else if (evenement.key.keysym.sym == SDLK_END) {
+ (*charselected) = (*nb_chars);
+ } else if (evenement.key.keysym.sym == SDLK_LEFT) {
+ if ((*charselected) != 0)
+ (*charselected)--;
+ } else if (evenement.key.keysym.sym == SDLK_RIGHT) {
+ if ((*charselected) < (*nb_chars))
+ (*charselected)++;
+ } else if (evenement.key.keysym.sym == SDLK_RETURN) {
+ waiting = false;
+ } else if (evenement.key.keysym.unicode >= 32 && evenement.key.keysym.unicode < 127 && (*nb_chars) < 60) {
+ for (int i = 255; i >= (*charselected) + 1; i--)
+ str[i] = str[i - 1];
+ str[*charselected] = evenement.key.keysym.unicode;
+ (*charselected)++;
+ (*nb_chars)++;
+ }
+ break;
+ }
+ }
+
+ if (!waiting) {
+ SDL_EnableKeyRepeat(0, 0); // disable key repeat
+ SDL_EnableUNICODE(false);
+ }
}
-int setKeySelected_thread(void* data) {
+int setKeySelected_thread(void* data)
+{
using namespace Game;
- int keycode=-1;
- SDL_Event evenement;
- while(keycode==-1) {
- SDL_WaitEvent(&evenement);
- switch(evenement.type) {
- case SDL_KEYDOWN:
- keycode = evenement.key.keysym.sym;
- break;
- case SDL_MOUSEBUTTONDOWN:
- keycode = SDLK_LAST+evenement.button.button;
- break;
- default:
- break;
- }
- }
- if(keycode != SDLK_ESCAPE) {
- fireSound();
- switch(keyselect) {
- case 0: forwardkey=keycode;
- break;
- case 1: backkey=keycode;
- break;
- case 2: leftkey=keycode;
- break;
- case 3: rightkey=keycode;
- break;
- case 4: crouchkey=keycode;
- break;
- case 5: jumpkey=keycode;
- break;
- case 6: drawkey=keycode;
- break;
- case 7: throwkey=keycode;
- break;
- case 8: attackkey=keycode;
- break;
- case 9: consolekey=keycode;
- break;
- default:
- break;
- }
- }
- keyselect=-1;
- waiting=false;
+ int keycode = -1;
+ SDL_Event evenement;
+ while (keycode == -1) {
+ SDL_WaitEvent(&evenement);
+ switch (evenement.type) {
+ case SDL_KEYDOWN:
+ keycode = evenement.key.keysym.sym;
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+ keycode = SDLK_LAST + evenement.button.button;
+ break;
+ default:
+ break;
+ }
+ }
+ if (keycode != SDLK_ESCAPE) {
+ fireSound();
+ switch (keyselect) {
+ case 0:
+ forwardkey = keycode;
+ break;
+ case 1:
+ backkey = keycode;
+ break;
+ case 2:
+ leftkey = keycode;
+ break;
+ case 3:
+ rightkey = keycode;
+ break;
+ case 4:
+ crouchkey = keycode;
+ break;
+ case 5:
+ jumpkey = keycode;
+ break;
+ case 6:
+ drawkey = keycode;
+ break;
+ case 7:
+ throwkey = keycode;
+ break;
+ case 8:
+ attackkey = keycode;
+ break;
+ case 9:
+ consolekey = keycode;
+ break;
+ default:
+ break;
+ }
+ }
+ keyselect = -1;
+ waiting = false;
LoadMenu();
return 0;
}
-void Game::setKeySelected() {
- waiting=true;
+void Game::setKeySelected()
+{
+ waiting = true;
printf("launch thread\n");
- SDL_Thread* thread = SDL_CreateThread(setKeySelected_thread,NULL);
+ SDL_Thread* thread = SDL_CreateThread(setKeySelected_thread, NULL);
if ( thread == NULL ) {
fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError());
- waiting=false;
+ waiting = false;
return;
}
}
#define NB_CAMPAIGN_MENU_ITEM 7
-namespace Game {
- extern Texture terraintexture;
- extern Texture terraintexture2;
- extern Texture loadscreentexture;
- extern Texture Maparrowtexture;
- extern Texture Mapboxtexture;
- extern Texture Mapcircletexture;
- extern Texture cursortexture;
- extern GLuint screentexture;
- extern GLuint screentexture2;
- extern Texture Mainmenuitems[10];
-
- extern int selected;
- extern int keyselect;
-
- extern int newdetail;
- extern int newscreenwidth;
- extern int newscreenheight;
-
- extern bool gameon;
- extern float deltah,deltav;
- extern int mousecoordh,mousecoordv;
- extern int oldmousecoordh,oldmousecoordv;
- extern float yaw,pitch;
- extern SkyBox *skybox;
- extern bool cameramode;
- extern bool firstload;
-
- extern float leveltime;
- extern float loadtime;
-
- extern Model hawk;
- extern XYZ hawkcoords;
- extern XYZ realhawkcoords;
- extern Texture hawktexture;
- extern float hawkyaw;
- extern float hawkcalldelay;
-
- extern Model eye;
- extern Model iris;
- extern Model cornea;
-
- extern bool stealthloading;
- extern int loading;
-
- extern int musictype;
-
- extern XYZ mapcenter;
- extern float mapradius;
-
- extern Text *text;
- extern float fps;
-
- extern bool editorenabled;
- extern int editortype;
- extern float editorsize;
- extern float editoryaw;
- extern float editorpitch;
-
- extern int tryquit;
-
- extern XYZ pathpoint[30];
- extern int numpathpoints;
- extern int numpathpointconnect[30];
- extern int pathpointconnect[30][30];
- extern int pathpointselected;
-
- extern int endgame;
- extern bool scoreadded;
- extern int numchallengelevels;
-
- extern bool console;
- extern char consoletext[15][256];
- extern int consolechars[15];
- extern bool chatting;
- extern char displaytext[15][256];
- extern int displaychars[15];
- extern float displaytime[15];
- extern float displayblinkdelay;
- extern bool displayblink;
- extern int displayselected;
- extern float consoleblinkdelay;
- extern bool consoleblink;
- extern int consoleselected;
-
- extern int oldenvironment;
- extern int targetlevel;
- extern float changedelay;
-
- extern bool waiting;
- extern Account* accountactive;
-
- extern unsigned short crouchkey,jumpkey,forwardkey,chatkey,backkey,leftkey,rightkey,drawkey,throwkey,attackkey;
- extern unsigned short consolekey;
-
- void newGame();
- void deleteGame();
-
- void InitGame();
- void LoadStuff();
- void LoadScreenTexture();
- void LoadingScreen();
- int DrawGLScene(StereoSide side);
- void LoadMenu();
- void Tick();
- void TickOnce();
- void TickOnceAfter();
- void SetUpLighting();
- GLvoid ReSizeGLScene(float fov, float near);
- int checkcollide(XYZ startpoint, XYZ endpoint);
- int checkcollide(XYZ startpoint, XYZ endpoint, int what);
-
- void fireSound(int sound=fireendsound);
- void setKeySelected();
-
- void inputText(char* str, int* charselected, int* nb_chars);
- void flash();
+namespace Game
+{
+extern Texture terraintexture;
+extern Texture terraintexture2;
+extern Texture loadscreentexture;
+extern Texture Maparrowtexture;
+extern Texture Mapboxtexture;
+extern Texture Mapcircletexture;
+extern Texture cursortexture;
+extern GLuint screentexture;
+extern GLuint screentexture2;
+extern Texture Mainmenuitems[10];
+
+extern int selected;
+extern int keyselect;
+
+extern int newdetail;
+extern int newscreenwidth;
+extern int newscreenheight;
+
+extern bool gameon;
+extern float deltah, deltav;
+extern int mousecoordh, mousecoordv;
+extern int oldmousecoordh, oldmousecoordv;
+extern float yaw, pitch;
+extern SkyBox *skybox;
+extern bool cameramode;
+extern bool firstload;
+
+extern float leveltime;
+extern float loadtime;
+
+extern Model hawk;
+extern XYZ hawkcoords;
+extern XYZ realhawkcoords;
+extern Texture hawktexture;
+extern float hawkyaw;
+extern float hawkcalldelay;
+
+extern Model eye;
+extern Model iris;
+extern Model cornea;
+
+extern bool stealthloading;
+extern int loading;
+
+extern int musictype;
+
+extern XYZ mapcenter;
+extern float mapradius;
+
+extern Text *text;
+extern float fps;
+
+extern bool editorenabled;
+extern int editortype;
+extern float editorsize;
+extern float editoryaw;
+extern float editorpitch;
+
+extern int tryquit;
+
+extern XYZ pathpoint[30];
+extern int numpathpoints;
+extern int numpathpointconnect[30];
+extern int pathpointconnect[30][30];
+extern int pathpointselected;
+
+extern int endgame;
+extern bool scoreadded;
+extern int numchallengelevels;
+
+extern bool console;
+extern char consoletext[15][256];
+extern int consolechars[15];
+extern bool chatting;
+extern char displaytext[15][256];
+extern int displaychars[15];
+extern float displaytime[15];
+extern float displayblinkdelay;
+extern bool displayblink;
+extern int displayselected;
+extern float consoleblinkdelay;
+extern bool consoleblink;
+extern int consoleselected;
+
+extern int oldenvironment;
+extern int targetlevel;
+extern float changedelay;
+
+extern bool waiting;
+extern Account* accountactive;
+
+extern unsigned short crouchkey, jumpkey, forwardkey, chatkey, backkey, leftkey, rightkey, drawkey, throwkey, attackkey;
+extern unsigned short consolekey;
+
+void newGame();
+void deleteGame();
+
+void InitGame();
+void LoadStuff();
+void LoadScreenTexture();
+void LoadingScreen();
+int DrawGLScene(StereoSide side);
+void LoadMenu();
+void Tick();
+void TickOnce();
+void TickOnceAfter();
+void SetUpLighting();
+GLvoid ReSizeGLScene(float fov, float near);
+int checkcollide(XYZ startpoint, XYZ endpoint);
+int checkcollide(XYZ startpoint, XYZ endpoint, int what);
+
+void fireSound(int sound = fireendsound);
+void setKeySelected();
+
+void inputText(char* str, int* charselected, int* nb_chars);
+void flash();
}
#ifndef __forceinline
SDL_GL_SwapBuffers();
}
-extern "C" { void UndefinedSymbolToExposeStubbedCode(void); }
+extern "C" {
+ void UndefinedSymbolToExposeStubbedCode(void);
+}
//#define STUBBED(x) UndefinedSymbolToExposeStubbedCode();
#define STUBBED(x) { static bool seen = false; if (!seen) { seen = true; fprintf(stderr, "STUBBED: %s at %s:%d\n", x, __FILE__, __LINE__); } }
//#define STUBBED(x)
extern int dialoguegonethrough[20];
enum maptypes {
- mapkilleveryone, mapgosomewhere,
- mapkillsomeone, mapkillmost // These two are unused
+ mapkilleveryone, mapgosomewhere,
+ mapkillsomeone, mapkillmost // These two are unused
};
enum pathtypes {wpkeepwalking, wppause};
static const char *pathtypenames[] = {"keepwalking", "pause"};
enum editortypes {typeactive, typesitting, typesittingwall, typesleeping,
- typedead1, typedead2, typedead3, typedead4};
+ typedead1, typedead2, typedead3, typedead4
+ };
static const char *editortypenames[] = {
- "active", "sitting", "sitting wall", "sleeping",
- "dead1", "dead2", "dead3", "dead4"
+ "active", "sitting", "sitting wall", "sleeping",
+ "dead1", "dead2", "dead3", "dead4"
};
#endif
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
extern float sps;
extern float viewdistance;
extern float fadestart;
-extern float screenwidth,screenheight;
+extern float screenwidth, screenheight;
extern int kTextureSize;
extern FRUSTUM frustum;
extern Light light;
extern float playerdist;
extern bool cellophane;
extern bool freeze;
-extern float flashamount,flashr,flashg,flashb;
+extern float flashamount, flashr, flashg, flashb;
extern int flashdelay;
extern int netstate;
extern float motionbluramount;
enum drawmodes {
- normalmode, motionblurmode, radialzoommode,
- realmotionblurmode, doublevisionmode, glowmode,
+ normalmode, motionblurmode, radialzoommode,
+ realmotionblurmode, doublevisionmode, glowmode,
};
-void Game::flash() { // shouldn't be that way, these should be attributes and Person class should not change rendering.
- flashr=1;
- flashg=0;
- flashb=0;
- flashamount=1;
- flashdelay=1;
+void Game::flash() // shouldn't be that way, these should be attributes and Person class should not change rendering.
+{
+ flashr = 1;
+ flashg = 0;
+ flashb = 0;
+ flashamount = 1;
+ flashdelay = 1;
}
void DrawMenu();
/*********************> DrawGLScene() <*****/
int Game::DrawGLScene(StereoSide side)
{
- static float texcoordwidth,texcoordheight;
- static float texviewwidth, texviewheight;
- static int i,j,k,l;
- static GLubyte color;
- static XYZ checkpoint;
- static float tempmult;
- float tutorialopac;
- static char string[256]="";
- static char string2[256]="";
- static char string3[256]="";
+ static float texcoordwidth, texcoordheight;
+ static float texviewwidth, texviewheight;
+ static int i, j, k, l;
+ static GLubyte color;
+ static XYZ checkpoint;
+ static float tempmult;
+ float tutorialopac;
+ static char string[256] = "";
+ static char string2[256] = "";
+ static char string3[256] = "";
static int drawmode = 0;
- if ( stereomode == stereoAnaglyph ) {
- switch(side) {
- case stereoLeft: glColorMask( 0.0, 1.0, 1.0, 1.0 ); break;
- case stereoRight: glColorMask( 1.0, 0.0, 0.0, 1.0 ); break;
- }
- } else {
- glColorMask( 1.0, 1.0, 1.0, 1.0 );
-
- if ( stereomode == stereoHorizontalInterlaced || stereomode == stereoVerticalInterlaced ) {
- glStencilFunc(side == stereoLeft ? GL_NOTEQUAL : GL_EQUAL, 0x01, 0x01);
- }
- }
-
- if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){
- tempmult=multiplier;
- multiplier=0;
- }
-
- if(!mainmenu){
- if(editorenabled){
- numboundaries=mapradius*2;
- if(numboundaries>360)numboundaries=360;
- for(i=0;i<numboundaries;i++){
- boundary[i]=0;
- boundary[i].z=1;
- boundary[i]=mapcenter+DoRotation(boundary[i]*mapradius,0,i*(360/((float)(numboundaries))),0);
- }
- }
-
- SetUpLighting();
-
- static int changed;
- changed=0;
-
- int olddrawmode=drawmode;
- if(ismotionblur&&!loading){
- if((findLengthfast(&player[0].velocity)>200)&&velocityblur&&!cameramode){
- drawmode=motionblurmode;
- motionbluramount=200/(findLengthfast(&player[0].velocity));
- changed=1;
- }
- if(player[0].damage-player[0].superpermanentdamage>(player[0].damagetolerance-player[0].superpermanentdamage)*1/2&&damageeffects&&!cameramode){
- drawmode=doublevisionmode;
- changed=1;
- }
- }
-
- if(slomo&&!loading){
- if(ismotionblur)
- drawmode=motionblurmode;
- motionbluramount=.2;
- slomodelay-=multiplier;
- if(slomodelay<0)
- slomo=0;
- camerashake=0;
- changed=1;
- }
- if((!changed&&!slomo)||loading){
- drawmode=normalmode;
- if(ismotionblur&&(/*fps>100||*/alwaysblur)){
- if(olddrawmode!=realmotionblurmode)
- change=1;
- else
- change=0;
- drawmode=realmotionblurmode;
- }else if(olddrawmode==realmotionblurmode)
- change=2;
- else
- change=0;
- }
-
- if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted))
- drawmode=normalmode;
- if((freeze||winfreeze)&&ismotionblur&&!mainmenu)
- drawmode=radialzoommode;
-
- if(winfreeze||mainmenu)drawmode=normalmode;
+ if ( stereomode == stereoAnaglyph ) {
+ switch (side) {
+ case stereoLeft:
+ glColorMask( 0.0, 1.0, 1.0, 1.0 );
+ break;
+ case stereoRight:
+ glColorMask( 1.0, 0.0, 0.0, 1.0 );
+ break;
+ }
+ } else {
+ glColorMask( 1.0, 1.0, 1.0, 1.0 );
+
+ if ( stereomode == stereoHorizontalInterlaced || stereomode == stereoVerticalInterlaced ) {
+ glStencilFunc(side == stereoLeft ? GL_NOTEQUAL : GL_EQUAL, 0x01, 0x01);
+ }
+ }
+
+ if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted)) {
+ tempmult = multiplier;
+ multiplier = 0;
+ }
+
+ if (!mainmenu) {
+ if (editorenabled) {
+ numboundaries = mapradius * 2;
+ if (numboundaries > 360)numboundaries = 360;
+ for (i = 0; i < numboundaries; i++) {
+ boundary[i] = 0;
+ boundary[i].z = 1;
+ boundary[i] = mapcenter + DoRotation(boundary[i] * mapradius, 0, i * (360 / ((float)(numboundaries))), 0);
+ }
+ }
+
+ SetUpLighting();
+
+ static int changed;
+ changed = 0;
+
+ int olddrawmode = drawmode;
+ if (ismotionblur && !loading) {
+ if ((findLengthfast(&player[0].velocity) > 200) && velocityblur && !cameramode) {
+ drawmode = motionblurmode;
+ motionbluramount = 200 / (findLengthfast(&player[0].velocity));
+ changed = 1;
+ }
+ if (player[0].damage - player[0].superpermanentdamage > (player[0].damagetolerance - player[0].superpermanentdamage) * 1 / 2 && damageeffects && !cameramode) {
+ drawmode = doublevisionmode;
+ changed = 1;
+ }
+ }
+
+ if (slomo && !loading) {
+ if (ismotionblur)
+ drawmode = motionblurmode;
+ motionbluramount = .2;
+ slomodelay -= multiplier;
+ if (slomodelay < 0)
+ slomo = 0;
+ camerashake = 0;
+ changed = 1;
+ }
+ if ((!changed && !slomo) || loading) {
+ drawmode = normalmode;
+ if (ismotionblur && (/*fps>100||*/alwaysblur)) {
+ if (olddrawmode != realmotionblurmode)
+ change = 1;
+ else
+ change = 0;
+ drawmode = realmotionblurmode;
+ } else if (olddrawmode == realmotionblurmode)
+ change = 2;
+ else
+ change = 0;
+ }
+
+ if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted))
+ drawmode = normalmode;
+ if ((freeze || winfreeze) && ismotionblur && !mainmenu)
+ drawmode = radialzoommode;
+
+ if (winfreeze || mainmenu)drawmode = normalmode;
#if PLATFORM_MACOSX
- if(drawmode==glowmode){
- RGBColor color2;
- color2.red=0;
- color2.green=0;
- color2.blue=0;
- DSpContext_FadeGamma(NULL,200,&color2);
- }
+ if (drawmode == glowmode) {
+ RGBColor color2;
+ color2.red = 0;
+ color2.green = 0;
+ color2.blue = 0;
+ DSpContext_FadeGamma(NULL, 200, &color2);
+ }
#endif
- if(drawtoggle!=2)
- drawtoggle=1-drawtoggle;
-
- if(!texcoordwidth){
- texviewwidth=kTextureSize;
- if(texviewwidth>screenwidth)
- texviewwidth=screenwidth;
- texviewheight=kTextureSize;
- if(texviewheight>screenheight)
- texviewheight=screenheight;
-
- texcoordwidth=screenwidth/kTextureSize;
- texcoordheight=screenheight/kTextureSize;
- if(texcoordwidth>1)
- texcoordwidth=1;
- if(texcoordheight>1)
- texcoordheight=1;
- }
-
- glDrawBuffer(GL_BACK);
- glReadBuffer(GL_BACK);
-
- //glFinish();
- static XYZ terrainlight;
- static float distance;
- if(drawmode==normalmode)
- Game::ReSizeGLScene(90,.1f);
- if(drawmode!=normalmode)
- glViewport(0,0,texviewwidth,texviewheight);
- glDepthFunc(GL_LEQUAL);
- glDepthMask(1);
- glAlphaFunc(GL_GREATER, 0.0001f);
- glEnable(GL_ALPHA_TEST);
- glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
- glClear(GL_DEPTH_BUFFER_BIT);
-
- glMatrixMode (GL_MODELVIEW);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glLoadIdentity ();
-
- // Move the camera for the current eye's point of view.
- // Reverse the movement if we're reversing stereo
- glTranslatef((stereoseparation/2) * side * (stereoreverse ? -1 : 1), 0, 0);
-
+ if (drawtoggle != 2)
+ drawtoggle = 1 - drawtoggle;
+
+ if (!texcoordwidth) {
+ texviewwidth = kTextureSize;
+ if (texviewwidth > screenwidth)
+ texviewwidth = screenwidth;
+ texviewheight = kTextureSize;
+ if (texviewheight > screenheight)
+ texviewheight = screenheight;
+
+ texcoordwidth = screenwidth / kTextureSize;
+ texcoordheight = screenheight / kTextureSize;
+ if (texcoordwidth > 1)
+ texcoordwidth = 1;
+ if (texcoordheight > 1)
+ texcoordheight = 1;
+ }
+
+ glDrawBuffer(GL_BACK);
+ glReadBuffer(GL_BACK);
+
+ //glFinish();
+ static XYZ terrainlight;
+ static float distance;
+ if (drawmode == normalmode)
+ Game::ReSizeGLScene(90, .1f);
+ if (drawmode != normalmode)
+ glViewport(0, 0, texviewwidth, texviewheight);
+ glDepthFunc(GL_LEQUAL);
+ glDepthMask(1);
+ glAlphaFunc(GL_GREATER, 0.0001f);
+ glEnable(GL_ALPHA_TEST);
+ glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode (GL_MODELVIEW);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glLoadIdentity ();
+
+ // Move the camera for the current eye's point of view.
+ // Reverse the movement if we're reversing stereo
+ glTranslatef((stereoseparation / 2) * side * (stereoreverse ? -1 : 1), 0, 0);
+
//camera effects
- if(!cameramode&&!freeze&&!winfreeze){
+ if (!cameramode && !freeze && !winfreeze) {
//shake
- glRotatef(float(Random()%100)/10*camerashake/*+(woozy*woozy)/10*/,0,0,1);
+ glRotatef(float(Random() % 100) / 10 * camerashake/*+(woozy*woozy)/10*/, 0, 0, 1);
//sway
- glRotatef(pitch+sin(woozy/2)*(player[0].damage/player[0].damagetolerance)*5,1,0,0);
- glRotatef(yaw+sin(woozy)*(player[0].damage/player[0].damagetolerance)*5,0,1,0);
- }
- if(cameramode||freeze||winfreeze){
- glRotatef(pitch,1,0,0);
- glRotatef(yaw,0,1,0);
- }
-
- if(environment==desertenvironment){
- glRotatef((float)(abs(Random()%100))/3000-1,1,0,0);
- glRotatef((float)(abs(Random()%100))/3000-1,0,1,0);
- }
- SetUpLight(&light,0);
- glPushMatrix();
+ glRotatef(pitch + sin(woozy / 2) * (player[0].damage / player[0].damagetolerance) * 5, 1, 0, 0);
+ glRotatef(yaw + sin(woozy) * (player[0].damage / player[0].damagetolerance) * 5, 0, 1, 0);
+ }
+ if (cameramode || freeze || winfreeze) {
+ glRotatef(pitch, 1, 0, 0);
+ glRotatef(yaw, 0, 1, 0);
+ }
+
+ if (environment == desertenvironment) {
+ glRotatef((float)(abs(Random() % 100)) / 3000 - 1, 1, 0, 0);
+ glRotatef((float)(abs(Random() % 100)) / 3000 - 1, 0, 1, 0);
+ }
+ SetUpLight(&light, 0);
+ glPushMatrix();
//heat blur effect in desert
- if(abs(blurness-targetblurness)<multiplier*10||abs(blurness-targetblurness)>2){
- blurness=targetblurness;
- targetblurness=(float)(abs(Random()%100))/40;
- }
- if(blurness<targetblurness)
- blurness+=multiplier*5;
- else
- blurness-=multiplier*5;
-
- if(environment==desertenvironment&&detail==2)
- glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness+.4 );
- if(environment==desertenvironment){
- glRotatef((float)(abs(Random()%100))/1000,1,0,0);
- glRotatef((float)(abs(Random()%100))/1000,0,1,0);
- }
- skybox->draw();
- glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0);
- glPopMatrix();
- glTranslatef(-viewer.x,-viewer.y,-viewer.z);
- frustum.GetFrustum();
-
- //make shadow decals on terrain and objects
- static XYZ point;
- static float size,opacity,rotation;
- rotation=0;
- for(k=0;k<numplayers;k++){
- if(!player[k].skeleton.free&&player[k].playerdetail&&player[k].howactive<typesleeping)
- if(frustum.SphereInFrustum(player[k].coords.x,player[k].coords.y+player[k].scale*3,player[k].coords.z,player[k].scale*7)&&player[k].occluded<25)
- for(i=0;i<player[k].skeleton.num_joints;i++){
- if(player[k].skeleton.joints[i].label==leftknee||player[k].skeleton.joints[i].label==rightknee||player[k].skeleton.joints[i].label==groin){
- point=DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
- size=.4f;
- opacity=.4-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/10;
- if(k!=0&&tutoriallevel==1){
- opacity=.2+.2*sin(smoketex*6+i)-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/10;
- }
- terrain.MakeDecal(shadowdecal,point,size,opacity,rotation);
- for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
- j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- if(objects.position[j].y<player[k].coords.y||objects.type[j]==tunneltype||objects.type[j]==weirdtype){
- point=DoRotation(DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
- size=.4f;
- opacity=.4f;
- if(k!=0&&tutoriallevel==1){
- opacity=.2+.2*sin(smoketex*6+i);
- }
- objects.model[j].MakeDecal(shadowdecal,&point,&size,&opacity,&rotation);
- }
- }
- }
- }
- if((player[k].skeleton.free||player[k].howactive>=typesleeping)&&player[k].playerdetail)
- if(frustum.SphereInFrustum(player[k].coords.x,player[k].coords.y,player[k].coords.z,player[k].scale*5)&&player[k].occluded<25)
- for(i=0;i<player[k].skeleton.num_joints;i++){
- if(player[k].skeleton.joints[i].label==leftknee||player[k].skeleton.joints[i].label==rightknee||player[k].skeleton.joints[i].label==groin||player[k].skeleton.joints[i].label==leftelbow||player[k].skeleton.joints[i].label==rightelbow||player[k].skeleton.joints[i].label==neck){
- if(player[k].skeleton.free)
- point=player[k].skeleton.joints[i].position*player[k].scale+player[k].coords;
+ if (abs(blurness - targetblurness) < multiplier * 10 || abs(blurness - targetblurness) > 2) {
+ blurness = targetblurness;
+ targetblurness = (float)(abs(Random() % 100)) / 40;
+ }
+ if (blurness < targetblurness)
+ blurness += multiplier * 5;
+ else
+ blurness -= multiplier * 5;
+
+ if (environment == desertenvironment && detail == 2)
+ glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness + .4 );
+ if (environment == desertenvironment) {
+ glRotatef((float)(abs(Random() % 100)) / 1000, 1, 0, 0);
+ glRotatef((float)(abs(Random() % 100)) / 1000, 0, 1, 0);
+ }
+ skybox->draw();
+ glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0);
+ glPopMatrix();
+ glTranslatef(-viewer.x, -viewer.y, -viewer.z);
+ frustum.GetFrustum();
+
+ //make shadow decals on terrain and objects
+ static XYZ point;
+ static float size, opacity, rotation;
+ rotation = 0;
+ for (k = 0; k < numplayers; k++) {
+ if (!player[k].skeleton.free && player[k].playerdetail && player[k].howactive < typesleeping)
+ if (frustum.SphereInFrustum(player[k].coords.x, player[k].coords.y + player[k].scale * 3, player[k].coords.z, player[k].scale * 7) && player[k].occluded < 25)
+ for (i = 0; i < player[k].skeleton.num_joints; i++) {
+ if (player[k].skeleton.joints[i].label == leftknee || player[k].skeleton.joints[i].label == rightknee || player[k].skeleton.joints[i].label == groin) {
+ point = DoRotation(player[k].skeleton.joints[i].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords;
+ size = .4f;
+ opacity = .4 - player[k].skeleton.joints[i].position.y * player[k].scale / 5 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 10;
+ if (k != 0 && tutoriallevel == 1) {
+ opacity = .2 + .2 * sin(smoketex * 6 + i) - player[k].skeleton.joints[i].position.y * player[k].scale / 5 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 10;
+ }
+ terrain.MakeDecal(shadowdecal, point, size, opacity, rotation);
+ for (l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+ j = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+ if (objects.position[j].y < player[k].coords.y || objects.type[j] == tunneltype || objects.type[j] == weirdtype) {
+ point = DoRotation(DoRotation(player[k].skeleton.joints[i].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords - objects.position[j], 0, -objects.yaw[j], 0);
+ size = .4f;
+ opacity = .4f;
+ if (k != 0 && tutoriallevel == 1) {
+ opacity = .2 + .2 * sin(smoketex * 6 + i);
+ }
+ objects.model[j].MakeDecal(shadowdecal, &point, &size, &opacity, &rotation);
+ }
+ }
+ }
+ }
+ if ((player[k].skeleton.free || player[k].howactive >= typesleeping) && player[k].playerdetail)
+ if (frustum.SphereInFrustum(player[k].coords.x, player[k].coords.y, player[k].coords.z, player[k].scale * 5) && player[k].occluded < 25)
+ for (i = 0; i < player[k].skeleton.num_joints; i++) {
+ if (player[k].skeleton.joints[i].label == leftknee || player[k].skeleton.joints[i].label == rightknee || player[k].skeleton.joints[i].label == groin || player[k].skeleton.joints[i].label == leftelbow || player[k].skeleton.joints[i].label == rightelbow || player[k].skeleton.joints[i].label == neck) {
+ if (player[k].skeleton.free)
+ point = player[k].skeleton.joints[i].position * player[k].scale + player[k].coords;
else
- point=DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
- size=.4f;
- opacity=.4-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/5;
- if(k!=0&&tutoriallevel==1){
- opacity=.2+.2*sin(smoketex*6+i)-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/10;
+ point = DoRotation(player[k].skeleton.joints[i].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords;
+ size = .4f;
+ opacity = .4 - player[k].skeleton.joints[i].position.y * player[k].scale / 5 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 5;
+ if (k != 0 && tutoriallevel == 1) {
+ opacity = .2 + .2 * sin(smoketex * 6 + i) - player[k].skeleton.joints[i].position.y * player[k].scale / 5 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 10;
}
- terrain.MakeDecal(shadowdecal,point,size,opacity*.7,rotation);
- for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
- j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- if(objects.position[j].y<player[k].coords.y||objects.type[j]==tunneltype||objects.type[j]==weirdtype){
- if(player[k].skeleton.free)point=DoRotation(player[k].skeleton.joints[i].position*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
- else point=DoRotation(DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
- size=.4f;
- opacity=.4f;
- if(k!=0&&tutoriallevel==1){
- opacity=.2+.2*sin(smoketex*6+i);
+ terrain.MakeDecal(shadowdecal, point, size, opacity * .7, rotation);
+ for (l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+ j = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+ if (objects.position[j].y < player[k].coords.y || objects.type[j] == tunneltype || objects.type[j] == weirdtype) {
+ if (player[k].skeleton.free)point = DoRotation(player[k].skeleton.joints[i].position * player[k].scale + player[k].coords - objects.position[j], 0, -objects.yaw[j], 0);
+ else point = DoRotation(DoRotation(player[k].skeleton.joints[i].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords - objects.position[j], 0, -objects.yaw[j], 0);
+ size = .4f;
+ opacity = .4f;
+ if (k != 0 && tutoriallevel == 1) {
+ opacity = .2 + .2 * sin(smoketex * 6 + i);
}
- objects.model[j].MakeDecal(shadowdecal,&point,&size,&opacity,&rotation);
+ objects.model[j].MakeDecal(shadowdecal, &point, &size, &opacity, &rotation);
}
}
}
}
- if(!player[k].playerdetail)
- if(frustum.SphereInFrustum(player[k].coords.x,player[k].coords.y,player[k].coords.z,player[k].scale*5)){
- point=player[k].coords;
- size=.7;
- opacity=.4-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/5;
- terrain.MakeDecal(shadowdecal,point,size,opacity*.7,rotation);
- for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
- j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- point=DoRotation(player[k].coords-objects.position[j],0,-objects.yaw[j],0);
- size=.7;
- opacity=.4f;
- objects.model[j].MakeDecal(shadowdecal,&point,&size,&opacity,&rotation);
+ if (!player[k].playerdetail)
+ if (frustum.SphereInFrustum(player[k].coords.x, player[k].coords.y, player[k].coords.z, player[k].scale * 5)) {
+ point = player[k].coords;
+ size = .7;
+ opacity = .4 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 5;
+ terrain.MakeDecal(shadowdecal, point, size, opacity * .7, rotation);
+ for (l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+ j = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+ point = DoRotation(player[k].coords - objects.position[j], 0, -objects.yaw[j], 0);
+ size = .7;
+ opacity = .4f;
+ objects.model[j].MakeDecal(shadowdecal, &point, &size, &opacity, &rotation);
}
}
- }
-
- //Terrain
- glEnable(GL_TEXTURE_2D);
- glDepthMask(1);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- terraintexture.bind();
- terrain.draw(0);
- terraintexture2.bind();
- terrain.draw(1);
- //glBindTexture( GL_TEXTURE_2D, terraintexture3);
- //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- //terrain.draw(2);
-
- terrain.drawdecals();
-
- //Model
- glEnable(GL_CULL_FACE);
- glEnable(GL_LIGHTING);
- glDisable(GL_BLEND);
- glEnable(GL_TEXTURE_2D);
- glDepthMask(1);
-
- glEnable(GL_COLOR_MATERIAL);
-
- test=2;
- tilt2weird=0;
- tiltweird=0;
- midweird=0;
- proportionweird=0;
- vertexweird[0]=0;
- vertexweird[1]=0;
- vertexweird[2]=0;
- vertexweird[3]=0;
- vertexweird[4]=0;
- vertexweird[5]=0;
-
- if(!cellophane){
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_FRONT);
- glDepthMask(1);
- for(k=0;k<numplayers;k++){
- if(k==0||tutoriallevel!=1){
- glEnable(GL_BLEND);
- glEnable(GL_LIGHTING);
- terrainlight=terrain.getLighting(player[k].coords.x,player[k].coords.z);
- distance=distsq(&viewer,&player[k].coords);
- distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
- if(distance>=1)
+ }
+
+ //Terrain
+ glEnable(GL_TEXTURE_2D);
+ glDepthMask(1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ terraintexture.bind();
+ terrain.draw(0);
+ terraintexture2.bind();
+ terrain.draw(1);
+ //glBindTexture( GL_TEXTURE_2D, terraintexture3);
+ //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ //terrain.draw(2);
+
+ terrain.drawdecals();
+
+ //Model
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glDisable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glDepthMask(1);
+
+ glEnable(GL_COLOR_MATERIAL);
+
+ test = 2;
+ tilt2weird = 0;
+ tiltweird = 0;
+ midweird = 0;
+ proportionweird = 0;
+ vertexweird[0] = 0;
+ vertexweird[1] = 0;
+ vertexweird[2] = 0;
+ vertexweird[3] = 0;
+ vertexweird[4] = 0;
+ vertexweird[5] = 0;
+
+ if (!cellophane) {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ glDepthMask(1);
+ for (k = 0; k < numplayers; k++) {
+ if (k == 0 || tutoriallevel != 1) {
+ glEnable(GL_BLEND);
+ glEnable(GL_LIGHTING);
+ terrainlight = terrain.getLighting(player[k].coords.x, player[k].coords.z);
+ distance = distsq(&viewer, &player[k].coords);
+ distance = (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance;
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+ if (distance >= 1)
glDisable(GL_BLEND);
- if(distance>=.5){
- checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
- checkpoint.y+=1;
- if(!player[k].occluded==0)
- i=checkcollide(viewer,checkpoint,player[k].lastoccluded);
- if(i==-1||player[k].occluded==0)
- i=checkcollide(viewer,checkpoint);
- if(i!=-1){
- player[k].occluded+=1;
- player[k].lastoccluded=i;
- }else
- player[k].occluded=0;
- if(player[k].occluded<25)
+ if (distance >= .5) {
+ checkpoint = DoRotation(player[k].skeleton.joints[abs(Random() % player[k].skeleton.num_joints)].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords;
+ checkpoint.y += 1;
+ if (!player[k].occluded == 0)
+ i = checkcollide(viewer, checkpoint, player[k].lastoccluded);
+ if (i == -1 || player[k].occluded == 0)
+ i = checkcollide(viewer, checkpoint);
+ if (i != -1) {
+ player[k].occluded += 1;
+ player[k].lastoccluded = i;
+ } else
+ player[k].occluded = 0;
+ if (player[k].occluded < 25)
player[k].DrawSkeleton();
- }
- }
- }
- }
-
- if(!cameramode&&musictype==stream_fighttheme)
- playerdist=distsqflat(&player[0].coords,&viewer);
- else
- playerdist=-100;
- glPushMatrix();
- glCullFace(GL_BACK);
- glEnable(GL_TEXTURE_2D);
- objects.Draw();
- glPopMatrix();
+ }
+ }
+ }
+ }
+
+ if (!cameramode && musictype == stream_fighttheme)
+ playerdist = distsqflat(&player[0].coords, &viewer);
+ else
+ playerdist = -100;
+ glPushMatrix();
+ glCullFace(GL_BACK);
+ glEnable(GL_TEXTURE_2D);
+ objects.Draw();
+ glPopMatrix();
//draw hawk
- glPushMatrix();
- if(frustum.SphereInFrustum(realhawkcoords.x+hawk.boundingspherecenter.x,realhawkcoords.y+hawk.boundingspherecenter.y,realhawkcoords.z+hawk.boundingspherecenter.z,2)){
- glAlphaFunc(GL_GREATER, 0.0001f);
- glDepthMask(1);
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glEnable(GL_BLEND);
- glTranslatef(hawkcoords.x,hawkcoords.y,hawkcoords.z);
- glRotatef(hawkyaw,0,1,0);
- glTranslatef(25,0,0);
- distance=distsq(&viewer,&realhawkcoords)*1.2;
- glColor4f(light.color[0],light.color[1],light.color[2],(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance);
- if((viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance>1)
- glColor4f(light.color[0],light.color[1],light.color[2],1);
- if((viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance>0)
- hawk.drawdifftex(hawktexture);
- }
- glPopMatrix();
-
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_FRONT);
- glDepthMask(1);
- for(k=0;k<numplayers;k++){
- if(!(k==0||tutoriallevel!=1)){
- glEnable(GL_BLEND);
- glEnable(GL_LIGHTING);
- terrainlight=terrain.getLighting(player[k].coords.x,player[k].coords.z);
- distance=distsq(&viewer,&player[k].coords);
- distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
- if(distance>=1)
+ glPushMatrix();
+ if (frustum.SphereInFrustum(realhawkcoords.x + hawk.boundingspherecenter.x, realhawkcoords.y + hawk.boundingspherecenter.y, realhawkcoords.z + hawk.boundingspherecenter.z, 2)) {
+ glAlphaFunc(GL_GREATER, 0.0001f);
+ glDepthMask(1);
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glEnable(GL_BLEND);
+ glTranslatef(hawkcoords.x, hawkcoords.y, hawkcoords.z);
+ glRotatef(hawkyaw, 0, 1, 0);
+ glTranslatef(25, 0, 0);
+ distance = distsq(&viewer, &realhawkcoords) * 1.2;
+ glColor4f(light.color[0], light.color[1], light.color[2], (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance);
+ if ((viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance > 1)
+ glColor4f(light.color[0], light.color[1], light.color[2], 1);
+ if ((viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance > 0)
+ hawk.drawdifftex(hawktexture);
+ }
+ glPopMatrix();
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ glDepthMask(1);
+ for (k = 0; k < numplayers; k++) {
+ if (!(k == 0 || tutoriallevel != 1)) {
+ glEnable(GL_BLEND);
+ glEnable(GL_LIGHTING);
+ terrainlight = terrain.getLighting(player[k].coords.x, player[k].coords.z);
+ distance = distsq(&viewer, &player[k].coords);
+ distance = (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance;
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+ if (distance >= 1)
glDisable(GL_BLEND);
- if(distance>=.5){
- checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
- checkpoint.y+=1;
- if(!player[k].occluded==0)
- i=checkcollide(viewer,checkpoint,player[k].lastoccluded);
- if(i==-1||player[k].occluded==0)
- i=checkcollide(viewer,checkpoint);
- if(i!=-1){
- player[k].occluded+=1;
- player[k].lastoccluded=i;
- }else
- player[k].occluded=0;
- if(player[k].occluded<25)
+ if (distance >= .5) {
+ checkpoint = DoRotation(player[k].skeleton.joints[abs(Random() % player[k].skeleton.num_joints)].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords;
+ checkpoint.y += 1;
+ if (!player[k].occluded == 0)
+ i = checkcollide(viewer, checkpoint, player[k].lastoccluded);
+ if (i == -1 || player[k].occluded == 0)
+ i = checkcollide(viewer, checkpoint);
+ if (i != -1) {
+ player[k].occluded += 1;
+ player[k].lastoccluded = i;
+ } else
+ player[k].occluded = 0;
+ if (player[k].occluded < 25)
player[k].DrawSkeleton();
- }
- }
- }
+ }
+ }
+ }
- glPushMatrix();
- glEnable(GL_TEXTURE_2D);
- weapons.Draw();
- glPopMatrix();
- glCullFace(GL_BACK);
+ glPushMatrix();
+ glEnable(GL_TEXTURE_2D);
+ weapons.Draw();
+ glPopMatrix();
+ glCullFace(GL_BACK);
- glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_COLOR_MATERIAL);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
- glDepthMask(0);
+ glDepthMask(0);
- Sprite::Draw();
+ Sprite::Draw();
//waypoints, pathpoints in editor
- if(editorenabled){
- glEnable(GL_BLEND);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_COLOR_MATERIAL);
- glColor4f(1,1,0,1);
-
- for(k=0;k<numplayers;k++){
- if(player[k].numwaypoints>1){
- glBegin(GL_LINE_LOOP);
- for(i=0;i<player[k].numwaypoints;i++){
- glVertex3f(player[k].waypoints[i].x,player[k].waypoints[i].y+.5,player[k].waypoints[i].z);
- }
- glEnd();
- }
- }
-
-
- if(numpathpoints>1){
- glColor4f(0,1,0,1);
- for(k=0;k<numpathpoints;k++){
- if(numpathpointconnect[k]){
- for(i=0;i<numpathpointconnect[k];i++){
- glBegin(GL_LINE_LOOP);
- glVertex3f(pathpoint[k].x,pathpoint[k].y+.5,pathpoint[k].z);
- glVertex3f(pathpoint[pathpointconnect[k][i]].x,pathpoint[pathpointconnect[k][i]].y+.5,pathpoint[pathpointconnect[k][i]].z);
- glEnd();
- }
- }
- }
- glColor4f(1,1,1,1);
- glPointSize(4);
- glBegin(GL_POINTS);
- glVertex3f(pathpoint[pathpointselected].x,pathpoint[pathpointselected].y+.5,pathpoint[pathpointselected].z);
- glEnd();
- }
- }
-
- //Text
-
- glEnable(GL_TEXTURE_2D);
- glColor4f(.5,.5,.5,1);
- if(!console) {
- sprintf (string, " ",(int)(fps));
- text->glPrint(10,30,string,0,.8,screenwidth,screenheight);
-
- if(!tutoriallevel)
- if(bonus>0&&bonustime<1&&!winfreeze&&indialogue==-1/*bonustime<4*/){
- const char *bonus_name;
- if (bonus < bonus_count)
- bonus_name = bonus_names[bonus];
- else
- bonus_name = "Excellent!"; // When does this happen?
-
- glColor4f(0,0,0,1-bonustime);
- text->glPrintOutline(1024/2-10*strlen(bonus_name)-4,768/16-4+768*4/5,bonus_name,1,2.5,1024,768);
- glColor4f(1,0,0,1-bonustime);
- text->glPrint(1024/2-10*strlen(bonus_name),768/16+768*4/5,bonus_name,1,2,1024,768);
-
- sprintf (string, "%d",(int)bonusvalue);
- glColor4f(0,0,0,1-bonustime);
- text->glPrintOutline(1024/2-10*strlen(string)-4,768/16-4-20+768*4/5,string,1,2.5*.8,1024,768);
- glColor4f(1,0,0,1-bonustime);
- text->glPrint(1024/2-10*strlen(string),768/16-20+768*4/5,string,1,2*.8,1024,768);
- glColor4f(.5,.5,.5,1);
- }
-
- if(tutoriallevel==1){
- tutorialopac=tutorialmaxtime-tutorialstagetime;
- if(tutorialopac>1)tutorialopac=1;
- if(tutorialopac<0)tutorialopac=0;
+ if (editorenabled) {
+ glEnable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_COLOR_MATERIAL);
+ glColor4f(1, 1, 0, 1);
+
+ for (k = 0; k < numplayers; k++) {
+ if (player[k].numwaypoints > 1) {
+ glBegin(GL_LINE_LOOP);
+ for (i = 0; i < player[k].numwaypoints; i++) {
+ glVertex3f(player[k].waypoints[i].x, player[k].waypoints[i].y + .5, player[k].waypoints[i].z);
+ }
+ glEnd();
+ }
+ }
+
+
+ if (numpathpoints > 1) {
+ glColor4f(0, 1, 0, 1);
+ for (k = 0; k < numpathpoints; k++) {
+ if (numpathpointconnect[k]) {
+ for (i = 0; i < numpathpointconnect[k]; i++) {
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(pathpoint[k].x, pathpoint[k].y + .5, pathpoint[k].z);
+ glVertex3f(pathpoint[pathpointconnect[k][i]].x, pathpoint[pathpointconnect[k][i]].y + .5, pathpoint[pathpointconnect[k][i]].z);
+ glEnd();
+ }
+ }
+ }
+ glColor4f(1, 1, 1, 1);
+ glPointSize(4);
+ glBegin(GL_POINTS);
+ glVertex3f(pathpoint[pathpointselected].x, pathpoint[pathpointselected].y + .5, pathpoint[pathpointselected].z);
+ glEnd();
+ }
+ }
+
+ //Text
+
+ glEnable(GL_TEXTURE_2D);
+ glColor4f(.5, .5, .5, 1);
+ if (!console) {
+ sprintf (string, " ", (int)(fps));
+ text->glPrint(10, 30, string, 0, .8, screenwidth, screenheight);
+
+ if (!tutoriallevel)
+ if (bonus > 0 && bonustime < 1 && !winfreeze && indialogue == -1/*bonustime<4*/) {
+ const char *bonus_name;
+ if (bonus < bonus_count)
+ bonus_name = bonus_names[bonus];
+ else
+ bonus_name = "Excellent!"; // When does this happen?
+
+ glColor4f(0, 0, 0, 1 - bonustime);
+ text->glPrintOutline(1024 / 2 - 10 * strlen(bonus_name) - 4, 768 / 16 - 4 + 768 * 4 / 5, bonus_name, 1, 2.5, 1024, 768);
+ glColor4f(1, 0, 0, 1 - bonustime);
+ text->glPrint(1024 / 2 - 10 * strlen(bonus_name), 768 / 16 + 768 * 4 / 5, bonus_name, 1, 2, 1024, 768);
+
+ sprintf (string, "%d", (int)bonusvalue);
+ glColor4f(0, 0, 0, 1 - bonustime);
+ text->glPrintOutline(1024 / 2 - 10 * strlen(string) - 4, 768 / 16 - 4 - 20 + 768 * 4 / 5, string, 1, 2.5 * .8, 1024, 768);
+ glColor4f(1, 0, 0, 1 - bonustime);
+ text->glPrint(1024 / 2 - 10 * strlen(string), 768 / 16 - 20 + 768 * 4 / 5, string, 1, 2 * .8, 1024, 768);
+ glColor4f(.5, .5, .5, 1);
+ }
+
+ if (tutoriallevel == 1) {
+ tutorialopac = tutorialmaxtime - tutorialstagetime;
+ if (tutorialopac > 1)tutorialopac = 1;
+ if (tutorialopac < 0)tutorialopac = 0;
sprintf (string, " ");
sprintf (string2, " ");
sprintf (string3, " ");
- if(tutorialstage==0){
+ if (tutorialstage == 0) {
sprintf (string, " ");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==1){
+ if (tutorialstage == 1) {
sprintf (string, "Welcome to the Lugaru training level!");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==2){
+ if (tutorialstage == 2) {
sprintf (string, "BASIC MOVEMENT:");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==3){
+ if (tutorialstage == 3) {
sprintf (string, "You can move the mouse to rotate the camera.");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==4){
- sprintf (string, "Try using the %s, %s, %s and %s keys to move around.",Input::keyToChar(forwardkey),Input::keyToChar(leftkey),Input::keyToChar(backkey),Input::keyToChar(rightkey));
+ if (tutorialstage == 4) {
+ sprintf (string, "Try using the %s, %s, %s and %s keys to move around.", Input::keyToChar(forwardkey), Input::keyToChar(leftkey), Input::keyToChar(backkey), Input::keyToChar(rightkey));
sprintf (string2, "All movement is relative to the camera.");
sprintf (string3, " ");
}
- if(tutorialstage==5){
- sprintf (string, "Please press %s to jump.",Input::keyToChar(jumpkey));
+ if (tutorialstage == 5) {
+ sprintf (string, "Please press %s to jump.", Input::keyToChar(jumpkey));
sprintf (string2, "You can hold it longer to jump higher.");
sprintf (string3, " ");
}
- if(tutorialstage==6){
- sprintf (string, "You can press %s to crouch.",Input::keyToChar(crouchkey));
+ if (tutorialstage == 6) {
+ sprintf (string, "You can press %s to crouch.", Input::keyToChar(crouchkey));
sprintf (string2, "You can jump higher from a crouching position.");
sprintf (string3, " ");
}
- if(tutorialstage==7){
- sprintf (string, "While running, you can press %s to roll.",Input::keyToChar(crouchkey));
+ if (tutorialstage == 7) {
+ sprintf (string, "While running, you can press %s to roll.", Input::keyToChar(crouchkey));
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==8){
+ if (tutorialstage == 8) {
sprintf (string, "While crouching, you can sneak around silently");
sprintf (string2, "using the movement keys.");
sprintf (string3, " ");
}
- if(tutorialstage==9){
+ if (tutorialstage == 9) {
sprintf (string, "Release the crouch key while sneaking and hold the movement keys");
sprintf (string2, "to run animal-style.");
sprintf (string3, " ");
}
- if(tutorialstage==10){
+ if (tutorialstage == 10) {
sprintf (string, "ADVANCED MOVEMENT:");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==11){
- sprintf (string, "When you jump at a wall, you can hold %s again",Input::keyToChar(jumpkey));
+ if (tutorialstage == 11) {
+ sprintf (string, "When you jump at a wall, you can hold %s again", Input::keyToChar(jumpkey));
sprintf (string2, "during impact to perform a walljump.");
sprintf (string3, "Be sure to use the movement keys to press against the wall");
}
- if(tutorialstage==12){
- sprintf (string, "While in the air, you can press crouch to flip.",Input::keyToChar(jumpkey));
+ if (tutorialstage == 12) {
+ sprintf (string, "While in the air, you can press crouch to flip.", Input::keyToChar(jumpkey));
sprintf (string2, "Walljumps and flips confuse enemies and give you more control.");
sprintf (string3, " ");
}
- if(tutorialstage==13){
+ if (tutorialstage == 13) {
sprintf (string, "BASIC COMBAT:");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==14){
+ if (tutorialstage == 14) {
sprintf (string, "There is now an imaginary enemy");
sprintf (string2, "in the middle of the training area.");
sprintf (string3, " ");
}
- if(tutorialstage==15){
- if(attackkey==MOUSEBUTTON1)sprintf (string, "Click to attack when you are near an enemy.");
- else sprintf (string, "Press %s to attack when you are near an enemy.",Input::keyToChar(attackkey));
+ if (tutorialstage == 15) {
+ if (attackkey == MOUSEBUTTON1)sprintf (string, "Click to attack when you are near an enemy.");
+ else sprintf (string, "Press %s to attack when you are near an enemy.", Input::keyToChar(attackkey));
sprintf (string2, "You can punch by standing still near an enemy and attacking.");
sprintf (string3, " ");
}
- if(tutorialstage==16){
+ if (tutorialstage == 16) {
sprintf (string, "If you are close, you will perform a weak punch.");
sprintf (string2, "The weak punch is excellent for starting attack combinations.");
sprintf (string3, " ");
}
- if(tutorialstage==17){
+ if (tutorialstage == 17) {
sprintf (string, "Attacking while running results in a spin kick.");
sprintf (string2, "This is one of your most powerful ground attacks.");
sprintf (string3, " ");
}
- if(tutorialstage==18){
+ if (tutorialstage == 18) {
sprintf (string, "Sweep the enemy's legs out by attacking while crouched.");
sprintf (string2, "This is a very fast attack, and easy to follow up.");
sprintf (string3, " ");
}
- if(tutorialstage==19){
+ if (tutorialstage == 19) {
sprintf (string, "When an enemy is on the ground, you can deal some extra");
sprintf (string2, "damage by running up and drop-kicking him.");
sprintf (string3, "(Try knocking them down with a sweep first)");
}
- if(tutorialstage==20){
+ if (tutorialstage == 20) {
sprintf (string, "Your most powerful individual attack is the rabbit kick.");
- if(attackkey==MOUSEBUTTON1)sprintf (string2, "Run at the enemy while holding the mouse button, and press");
+ if (attackkey == MOUSEBUTTON1)sprintf (string2, "Run at the enemy while holding the mouse button, and press");
else sprintf (string2, "Run at the enemy while holding %s, and press", Input::keyToChar(attackkey));
- sprintf (string3, "the jump key (%s) to attack.",Input::keyToChar(jumpkey));
+ sprintf (string3, "the jump key (%s) to attack.", Input::keyToChar(jumpkey));
}
- if(tutorialstage==21){
+ if (tutorialstage == 21) {
sprintf (string, "This attack is devastating if timed correctly.");
sprintf (string2, "Even if timed incorrectly, it will knock the enemy over.");
- if(againbonus)sprintf (string3, "Try rabbit-kicking the imaginary enemy again.");
+ if (againbonus)sprintf (string3, "Try rabbit-kicking the imaginary enemy again.");
else sprintf (string3, "Try rabbit-kicking the imaginary enemy.");
}
- if(tutorialstage==22){
+ if (tutorialstage == 22) {
sprintf (string, "If you sneak behind an enemy unnoticed, you can kill");
sprintf (string2, "him instantly. Move close behind this enemy");
sprintf (string3, "and attack.");
}
- if(tutorialstage==23){
+ if (tutorialstage == 23) {
sprintf (string, "Another important attack is the wall kick. When an enemy");
sprintf (string2, "is near a wall, perform a walljump nearby and hold");
sprintf (string3, "the attack key during impact with the wall.");
}
- if(tutorialstage==24){
+ if (tutorialstage == 24) {
sprintf (string, "You can tackle enemies by running at them animal-style");
- if(attackkey==MOUSEBUTTON1)sprintf (string2, "and pressing jump (%s) or attack(mouse button).",Input::keyToChar(jumpkey));
- else sprintf (string2, "and pressing jump (%s) or attack(%s).",Input::keyToChar(jumpkey),Input::keyToChar(attackkey));
+ if (attackkey == MOUSEBUTTON1)sprintf (string2, "and pressing jump (%s) or attack(mouse button).", Input::keyToChar(jumpkey));
+ else sprintf (string2, "and pressing jump (%s) or attack(%s).", Input::keyToChar(jumpkey), Input::keyToChar(attackkey));
sprintf (string3, "This is especially useful when they are running away.");
}
- if(tutorialstage==25){
+ if (tutorialstage == 25) {
sprintf (string, "Dodge by pressing back and attack. Dodging is essential");
sprintf (string2, "against enemies with swords or other long weapons.");
sprintf (string3, " ");
}
- if(tutorialstage==26){
+ if (tutorialstage == 26) {
sprintf (string, "REVERSALS AND COUNTER-REVERSALS");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==27){
+ if (tutorialstage == 27) {
sprintf (string, "The enemy can now reverse your attacks.");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==28){
+ if (tutorialstage == 28) {
sprintf (string, "If you attack, you will notice that the enemy now sometimes");
sprintf (string2, "catches your attack and uses it against you. Hold");
- sprintf (string3, "crouch (%s) after attacking to escape from reversals.",Input::keyToChar(crouchkey));
+ sprintf (string3, "crouch (%s) after attacking to escape from reversals.", Input::keyToChar(crouchkey));
}
- if(tutorialstage==29){
+ if (tutorialstage == 29) {
sprintf (string, "Try escaping from two more reversals in a row.");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==30){
+ if (tutorialstage == 30) {
sprintf (string, "Good!");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==31){
- sprintf (string, "To reverse an attack, you must tap crouch (%s) during the",Input::keyToChar(crouchkey));
+ if (tutorialstage == 31) {
+ sprintf (string, "To reverse an attack, you must tap crouch (%s) during the", Input::keyToChar(crouchkey));
sprintf (string2, "enemy's attack. You must also be close to the enemy;");
sprintf (string3, "this is especially important against armed opponents.");
}
- if(tutorialstage==32){
- sprintf (string, "The enemy can attack in %d seconds.", (int)(tutorialmaxtime-tutorialstagetime));
+ if (tutorialstage == 32) {
+ sprintf (string, "The enemy can attack in %d seconds.", (int)(tutorialmaxtime - tutorialstagetime));
sprintf (string2, "This imaginary opponents attacks will be highlighted");
sprintf (string3, "to make this easier.");
}
- if(tutorialstage==33){
+ if (tutorialstage == 33) {
sprintf (string, "Reverse three enemy attacks!");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==34){
+ if (tutorialstage == 34) {
sprintf (string, "Reverse two more enemy attacks!");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==35){
+ if (tutorialstage == 35) {
sprintf (string, "Reverse one more enemy attack!");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==36){
+ if (tutorialstage == 36) {
sprintf (string, "Excellent!");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==37){
- sprintf (string, "Now spar with the enemy for %d more seconds.", (int)(tutorialmaxtime-tutorialstagetime));
- sprintf (string2, "Damage dealt: %d",(int)damagedealt);
- sprintf (string3, "Damage taken: %d.",(int)damagetaken);
+ if (tutorialstage == 37) {
+ sprintf (string, "Now spar with the enemy for %d more seconds.", (int)(tutorialmaxtime - tutorialstagetime));
+ sprintf (string2, "Damage dealt: %d", (int)damagedealt);
+ sprintf (string3, "Damage taken: %d.", (int)damagetaken);
}
- if(tutorialstage==38){
+ if (tutorialstage == 38) {
sprintf (string, "WEAPONS:");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==39){
+ if (tutorialstage == 39) {
sprintf (string, "There is now an imaginary knife");
sprintf (string2, "in the center of the training area.");
sprintf (string3, " ");
}
- if(tutorialstage==40){
+ if (tutorialstage == 40) {
sprintf (string, "Stand, roll or handspring over the knife");
- sprintf (string2, "while pressing %s to pick it up.",Input::keyToChar(throwkey));
+ sprintf (string2, "while pressing %s to pick it up.", Input::keyToChar(throwkey));
sprintf (string3, "You can crouch and press the same key to drop it again.");
}
- if(tutorialstage==41){
- sprintf (string, "You can equip and unequip weapons using the %s key.",Input::keyToChar(drawkey));
+ if (tutorialstage == 41) {
+ sprintf (string, "You can equip and unequip weapons using the %s key.", Input::keyToChar(drawkey));
sprintf (string2, "Sometimes it is best to keep them unequipped to");
sprintf (string3, "prevent enemies from taking them. ");
}
- if(tutorialstage==42){
+ if (tutorialstage == 42) {
sprintf (string, "The knife is the smallest weapon and the least encumbering.");
sprintf (string2, "You can equip or unequip it while standing, crouching,");
sprintf (string3, "running or flipping.");
}
- if(tutorialstage==43){
+ if (tutorialstage == 43) {
sprintf (string, "You perform weapon attacks the same way as unarmed attacks,");
sprintf (string2, "but sharp weapons cause permanent damage, instead of the");
sprintf (string3, "temporary trauma from blunt weapons, fists and feet.");
}
- if(tutorialstage==44){
+ if (tutorialstage == 44) {
sprintf (string, "The enemy now has your knife!");
sprintf (string2, "Please reverse two of his knife attacks.");
sprintf (string3, " ");
}
- if(tutorialstage==45){
+ if (tutorialstage == 45) {
sprintf (string, "Please reverse one more of his knife attacks.");
sprintf (string2, " ");
sprintf (string3, " ");
}
- if(tutorialstage==46){
+ if (tutorialstage == 46) {
sprintf (string, "Now he has a sword!");
sprintf (string2, "The sword has longer reach than your arms, so you");
sprintf (string3, "must move close to reverse the sword slash.");
}
- if(tutorialstage==47){
+ if (tutorialstage == 47) {
sprintf (string, "Long weapons like the sword and staff are also useful for defense;");
sprintf (string2, "you can parry enemy weapon attacks by pressing the attack key");
sprintf (string3, "at the right time. Please try parrying the enemy's attacks!");
}
- if(tutorialstage==48){
+ if (tutorialstage == 48) {
sprintf (string, "The staff is like the sword, but has two main attacks.");
sprintf (string2, "The standing smash is fast and effective, and the running");
sprintf (string3, "spin smash is slower and more powerful.");
}
- if(tutorialstage==49){
- sprintf (string, "When facing an enemy, you can throw the knife with %s.",Input::keyToChar(throwkey));
+ if (tutorialstage == 49) {
+ sprintf (string, "When facing an enemy, you can throw the knife with %s.", Input::keyToChar(throwkey));
sprintf (string2, "It is possible to throw the knife while flipping,");
sprintf (string3, "but it is very inaccurate.");
}
- if(tutorialstage==50){
+ if (tutorialstage == 50) {
sprintf (string, "You now know everything you can learn from training.");
sprintf (string2, "Everything else you must learn from experience!");
sprintf (string3, " ");
}
- if(tutorialstage==51){
+ if (tutorialstage == 51) {
sprintf (string, "Walk out of the training area to return to the main menu.");
sprintf (string2, " ");
sprintf (string3, " ");
}
- glColor4f(0,0,0,tutorialopac);
- text->glPrintOutline(screenwidth/2-7.6*strlen(string)*screenwidth/1024-4,screenheight/16-4+screenheight*4/5,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
- text->glPrintOutline(screenwidth/2-7.6*strlen(string2)*screenwidth/1024-4,screenheight/16-4+screenheight*4/5-20*screenwidth/1024,string2,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
- text->glPrintOutline(screenwidth/2-7.6*strlen(string3)*screenwidth/1024-4,screenheight/16-4+screenheight*4/5-40*screenwidth/1024,string3,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
- glColor4f(1,1,1,tutorialopac);
- text->glPrint(screenwidth/2-7.6*strlen(string)*screenwidth/1024,screenheight/16+screenheight*4/5,string,1,1.5*screenwidth/1024,screenwidth,screenheight);
- text->glPrint(screenwidth/2-7.6*strlen(string2)*screenwidth/1024,screenheight/16+screenheight*4/5-20*screenwidth/1024,string2,1,1.5*screenwidth/1024,screenwidth,screenheight);
- text->glPrint(screenwidth/2-7.6*strlen(string3)*screenwidth/1024,screenheight/16+screenheight*4/5-40*screenwidth/1024,string3,1,1.5*screenwidth/1024,screenwidth,screenheight);
+ glColor4f(0, 0, 0, tutorialopac);
+ text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string)*screenwidth / 1024 - 4, screenheight / 16 - 4 + screenheight * 4 / 5, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
+ text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024 - 4, screenheight / 16 - 4 + screenheight * 4 / 5 - 20 * screenwidth / 1024, string2, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
+ text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024 - 4, screenheight / 16 - 4 + screenheight * 4 / 5 - 40 * screenwidth / 1024, string3, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
+ glColor4f(1, 1, 1, tutorialopac);
+ text->glPrint(screenwidth / 2 - 7.6 * strlen(string)*screenwidth / 1024, screenheight / 16 + screenheight * 4 / 5, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight);
+ text->glPrint(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024, screenheight / 16 + screenheight * 4 / 5 - 20 * screenwidth / 1024, string2, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight);
+ text->glPrint(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024, screenheight / 16 + screenheight * 4 / 5 - 40 * screenwidth / 1024, string3, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight);
- sprintf (string, "Press 'tab' to skip to the next item.",Input::keyToChar(jumpkey));
+ sprintf (string, "Press 'tab' to skip to the next item.", Input::keyToChar(jumpkey));
sprintf (string2, "Press escape at any time to");
sprintf (string3, "pause or exit the tutorial.");
- glColor4f(0,0,0,1);
- text->glPrintOutline(screenwidth/2-7.6*strlen(string)*screenwidth/1024*.8-4,0-4+screenheight*1/10,string,1,1.5*1.25*screenwidth/1024*.8,screenwidth,screenheight);
- text->glPrintOutline(screenwidth/2-7.6*strlen(string2)*screenwidth/1024*.8-4,0-4+screenheight*1/10-20*.8*screenwidth/1024,string2,1,1.5*1.25*screenwidth/1024*.8,screenwidth,screenheight);
- text->glPrintOutline(screenwidth/2-7.6*strlen(string3)*screenwidth/1024*.8-4,0-4+screenheight*1/10-40*.8*screenwidth/1024,string3,1,1.5*1.25*screenwidth/1024*.8,screenwidth,screenheight);
- glColor4f(0.5,0.5,0.5,1);
- text->glPrint(screenwidth/2-7.6*strlen(string)*screenwidth/1024*.8,0+screenheight*1/10,string,1,1.5*screenwidth/1024*.8,screenwidth,screenheight);
- text->glPrint(screenwidth/2-7.6*strlen(string2)*screenwidth/1024*.8,0+screenheight*1/10-20*.8*screenwidth/1024,string2,1,1.5*screenwidth/1024*.8,screenwidth,screenheight);
- text->glPrint(screenwidth/2-7.6*strlen(string3)*screenwidth/1024*.8,0+screenheight*1/10-40*.8*screenwidth/1024,string3,1,1.5*screenwidth/1024*.8,screenwidth,screenheight);
+ glColor4f(0, 0, 0, 1);
+ text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string)*screenwidth / 1024 * .8 - 4, 0 - 4 + screenheight * 1 / 10, string, 1, 1.5 * 1.25 * screenwidth / 1024 * .8, screenwidth, screenheight);
+ text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024 * .8 - 4, 0 - 4 + screenheight * 1 / 10 - 20 * .8 * screenwidth / 1024, string2, 1, 1.5 * 1.25 * screenwidth / 1024 * .8, screenwidth, screenheight);
+ text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024 * .8 - 4, 0 - 4 + screenheight * 1 / 10 - 40 * .8 * screenwidth / 1024, string3, 1, 1.5 * 1.25 * screenwidth / 1024 * .8, screenwidth, screenheight);
+ glColor4f(0.5, 0.5, 0.5, 1);
+ text->glPrint(screenwidth / 2 - 7.6 * strlen(string)*screenwidth / 1024 * .8, 0 + screenheight * 1 / 10, string, 1, 1.5 * screenwidth / 1024 * .8, screenwidth, screenheight);
+ text->glPrint(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024 * .8, 0 + screenheight * 1 / 10 - 20 * .8 * screenwidth / 1024, string2, 1, 1.5 * screenwidth / 1024 * .8, screenwidth, screenheight);
+ text->glPrint(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024 * .8, 0 + screenheight * 1 / 10 - 40 * .8 * screenwidth / 1024, string3, 1, 1.5 * screenwidth / 1024 * .8, screenwidth, screenheight);
}
- //Hot spots
-
- if(numhotspots&&(bonustime>=1||bonus<=0||bonustime<0)&&!tutoriallevel){
- int closest=-1;
- float closestdist=-1;
- float distance=0;
- closest=currenthotspot;
- for(i=0;i<numhotspots;i++){
- distance=distsq(&player[0].coords,&hotspot[i]);
- if(closestdist==-1||distance<closestdist){
- if(distsq(&player[0].coords,&hotspot[i])<hotspotsize[i]&&((hotspottype[i]<=10&&hotspottype[i]>=0)||(hotspottype[i]<=40&&hotspottype[i]>=20))){
- closestdist=distance;
- closest=i;
+ //Hot spots
+
+ if (numhotspots && (bonustime >= 1 || bonus <= 0 || bonustime < 0) && !tutoriallevel) {
+ int closest = -1;
+ float closestdist = -1;
+ float distance = 0;
+ closest = currenthotspot;
+ for (i = 0; i < numhotspots; i++) {
+ distance = distsq(&player[0].coords, &hotspot[i]);
+ if (closestdist == -1 || distance < closestdist) {
+ if (distsq(&player[0].coords, &hotspot[i]) < hotspotsize[i] && ((hotspottype[i] <= 10 && hotspottype[i] >= 0) || (hotspottype[i] <= 40 && hotspottype[i] >= 20))) {
+ closestdist = distance;
+ closest = i;
}
}
}
- if(closest!=-1)
- currenthotspot=closest;
- if(currenthotspot!=-1){
- if(hotspottype[closest]<=10){
- if(distsq(&player[0].coords,&hotspot[closest])<hotspotsize[closest])
- tutorialstagetime=0;
- tutorialmaxtime=1;
- tutorialopac=tutorialmaxtime-tutorialstagetime;
- if(tutorialopac>1)tutorialopac=1;
- if(tutorialopac<0)tutorialopac=0;
+ if (closest != -1)
+ currenthotspot = closest;
+ if (currenthotspot != -1) {
+ if (hotspottype[closest] <= 10) {
+ if (distsq(&player[0].coords, &hotspot[closest]) < hotspotsize[closest])
+ tutorialstagetime = 0;
+ tutorialmaxtime = 1;
+ tutorialopac = tutorialmaxtime - tutorialstagetime;
+ if (tutorialopac > 1)tutorialopac = 1;
+ if (tutorialopac < 0)tutorialopac = 0;
sprintf (string, "%s", hotspottext[closest]);
int lastline = 0;
int line = 0;
bool done = false;
- i=0;
- while(!done){
- if(string[i]=='\n'||string[i]>'z'||string[i]<' '||string[i]=='\0'){
- glColor4f(0,0,0,tutorialopac);
- text->glPrintOutline(screenwidth/2-7.6*(i-lastline)*screenwidth/1024-4,screenheight/16-4+screenheight*4/5-20*screenwidth/1024*line,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight,lastline,i);
- glColor4f(1,1,1,tutorialopac);
- text->glPrint(screenwidth/2-7.6*(i-lastline)*screenwidth/1024,screenheight/16+screenheight*4/5-20*screenwidth/1024*line,string,1,1.5*screenwidth/1024,screenwidth,screenheight,lastline,i);
- lastline=i+1;
+ i = 0;
+ while (!done) {
+ if (string[i] == '\n' || string[i] > 'z' || string[i] < ' ' || string[i] == '\0') {
+ glColor4f(0, 0, 0, tutorialopac);
+ text->glPrintOutline(screenwidth / 2 - 7.6 * (i - lastline)*screenwidth / 1024 - 4, screenheight / 16 - 4 + screenheight * 4 / 5 - 20 * screenwidth / 1024 * line, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
+ glColor4f(1, 1, 1, tutorialopac);
+ text->glPrint(screenwidth / 2 - 7.6 * (i - lastline)*screenwidth / 1024, screenheight / 16 + screenheight * 4 / 5 - 20 * screenwidth / 1024 * line, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
+ lastline = i + 1;
line++;
- if(string[i]=='\0')done=1;
+ if (string[i] == '\0')done = 1;
}
- if(i>=255)done=1;
+ if (i >= 255)done = 1;
i++;
}
- } else if (hotspottype[closest]>=20&&dialoguegonethrough[hotspottype[closest]-20]==0){
- whichdialogue=hotspottype[closest]-20;
- for(j=0;j<numdialogueboxes[whichdialogue];j++){
- player[participantfocus[whichdialogue][j]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
- player[participantfocus[whichdialogue][j]].yaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
- player[participantfocus[whichdialogue][j]].targetyaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
- player[participantfocus[whichdialogue][j]].velocity=0;
- player[participantfocus[whichdialogue][j]].animTarget=player[participantfocus[whichdialogue][j]].getIdle();
- player[participantfocus[whichdialogue][j]].frameTarget=0;
+ } else if (hotspottype[closest] >= 20 && dialoguegonethrough[hotspottype[closest] - 20] == 0) {
+ whichdialogue = hotspottype[closest] - 20;
+ for (j = 0; j < numdialogueboxes[whichdialogue]; j++) {
+ player[participantfocus[whichdialogue][j]].coords = participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].yaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].targetyaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].velocity = 0;
+ player[participantfocus[whichdialogue][j]].animTarget = player[participantfocus[whichdialogue][j]].getIdle();
+ player[participantfocus[whichdialogue][j]].frameTarget = 0;
}
- directing=0;
- indialogue=0;
+ directing = 0;
+ indialogue = 0;
dialoguegonethrough[whichdialogue]++;
- if(dialogueboxsound[whichdialogue][indialogue]!=0){
+ if (dialogueboxsound[whichdialogue][indialogue] != 0) {
int whichsoundplay;
- if(dialogueboxsound[whichdialogue][indialogue]==1)whichsoundplay=rabbitchitter;
- if(dialogueboxsound[whichdialogue][indialogue]==2)whichsoundplay=rabbitchitter2;
- if(dialogueboxsound[whichdialogue][indialogue]==3)whichsoundplay=rabbitpainsound;
- if(dialogueboxsound[whichdialogue][indialogue]==4)whichsoundplay=rabbitpain1sound;
- if(dialogueboxsound[whichdialogue][indialogue]==5)whichsoundplay=rabbitattacksound;
- if(dialogueboxsound[whichdialogue][indialogue]==6)whichsoundplay=rabbitattack2sound;
- if(dialogueboxsound[whichdialogue][indialogue]==7)whichsoundplay=rabbitattack3sound;
- if(dialogueboxsound[whichdialogue][indialogue]==8)whichsoundplay=rabbitattack4sound;
- if(dialogueboxsound[whichdialogue][indialogue]==9)whichsoundplay=growlsound;
- if(dialogueboxsound[whichdialogue][indialogue]==10)whichsoundplay=growl2sound;
- if(dialogueboxsound[whichdialogue][indialogue]==11)whichsoundplay=snarlsound;
- if(dialogueboxsound[whichdialogue][indialogue]==12)whichsoundplay=snarl2sound;
- if(dialogueboxsound[whichdialogue][indialogue]==13)whichsoundplay=barksound;
- if(dialogueboxsound[whichdialogue][indialogue]==14)whichsoundplay=bark2sound;
- if(dialogueboxsound[whichdialogue][indialogue]==15)whichsoundplay=bark3sound;
- if(dialogueboxsound[whichdialogue][indialogue]==16)whichsoundplay=barkgrowlsound;
- if(dialogueboxsound[whichdialogue][indialogue]==-1)whichsoundplay=fireendsound;
- if(dialogueboxsound[whichdialogue][indialogue]==-2)whichsoundplay=firestartsound;
- if(dialogueboxsound[whichdialogue][indialogue]==-3)whichsoundplay=consolesuccesssound;
- if(dialogueboxsound[whichdialogue][indialogue]==-4)whichsoundplay=consolefailsound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 1)whichsoundplay = rabbitchitter;
+ if (dialogueboxsound[whichdialogue][indialogue] == 2)whichsoundplay = rabbitchitter2;
+ if (dialogueboxsound[whichdialogue][indialogue] == 3)whichsoundplay = rabbitpainsound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 4)whichsoundplay = rabbitpain1sound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 5)whichsoundplay = rabbitattacksound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 6)whichsoundplay = rabbitattack2sound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 7)whichsoundplay = rabbitattack3sound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 8)whichsoundplay = rabbitattack4sound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 9)whichsoundplay = growlsound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 10)whichsoundplay = growl2sound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 11)whichsoundplay = snarlsound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 12)whichsoundplay = snarl2sound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 13)whichsoundplay = barksound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 14)whichsoundplay = bark2sound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 15)whichsoundplay = bark3sound;
+ if (dialogueboxsound[whichdialogue][indialogue] == 16)whichsoundplay = barkgrowlsound;
+ if (dialogueboxsound[whichdialogue][indialogue] == -1)whichsoundplay = fireendsound;
+ if (dialogueboxsound[whichdialogue][indialogue] == -2)whichsoundplay = firestartsound;
+ if (dialogueboxsound[whichdialogue][indialogue] == -3)whichsoundplay = consolesuccesssound;
+ if (dialogueboxsound[whichdialogue][indialogue] == -4)whichsoundplay = consolefailsound;
emit_sound_at(whichsoundplay, player[participantfocus[whichdialogue][indialogue]].coords);
}
}
}
}
- if(indialogue!=-1&&!mainmenu){
+ if (indialogue != -1 && !mainmenu) {
glDisable(GL_DEPTH_TEST); // Disables Depth Testing
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPushMatrix(); // Store The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPushMatrix(); // Store The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
- if(dialogueboxlocation[whichdialogue][indialogue]==1)glTranslatef(0,screenheight*3/4,0);
- glScalef(screenwidth,screenheight/4,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ if (dialogueboxlocation[whichdialogue][indialogue] == 1)glTranslatef(0, screenheight * 3 / 4, 0);
+ glScalef(screenwidth, screenheight / 4, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- glColor4f(dialogueboxcolor[whichdialogue][indialogue][0],dialogueboxcolor[whichdialogue][indialogue][1],dialogueboxcolor[whichdialogue][indialogue][2],0.7);
+ glColor4f(dialogueboxcolor[whichdialogue][indialogue][0], dialogueboxcolor[whichdialogue][indialogue][1], dialogueboxcolor[whichdialogue][indialogue][2], 0.7);
glBegin(GL_QUADS);
glVertex3f(0, 0, 0.0f);
glVertex3f(1, 0, 0.0f);
glDepthMask(1);
glEnable(GL_TEXTURE_2D);
- tutorialopac=1;
+ tutorialopac = 1;
float startx;
float starty;
- startx=screenwidth*1/5;
- if(dialogueboxlocation[whichdialogue][indialogue]==1)
- starty=screenheight/16+screenheight*4/5;
- if(dialogueboxlocation[whichdialogue][indialogue]==2)
- starty=screenheight*1/5-screenheight/16;
+ startx = screenwidth * 1 / 5;
+ if (dialogueboxlocation[whichdialogue][indialogue] == 1)
+ starty = screenheight / 16 + screenheight * 4 / 5;
+ if (dialogueboxlocation[whichdialogue][indialogue] == 2)
+ starty = screenheight * 1 / 5 - screenheight / 16;
char tempname[264];
bool goodchar;
- int tempnum=0;
- for(i=0;i<264;i++){
- tempname[i]='\0';
+ int tempnum = 0;
+ for (i = 0; i < 264; i++) {
+ tempname[i] = '\0';
}
- for(i=0;i<(int)strlen(dialoguename[whichdialogue][indialogue]);i++){
- tempname[tempnum]=dialoguename[whichdialogue][indialogue][i];
- goodchar=1;
- if(dialoguename[whichdialogue][indialogue][i]=='#'||dialoguename[whichdialogue][indialogue][i]=='\0')goodchar=0;
- if(goodchar)
+ for (i = 0; i < (int)strlen(dialoguename[whichdialogue][indialogue]); i++) {
+ tempname[tempnum] = dialoguename[whichdialogue][indialogue][i];
+ goodchar = 1;
+ if (dialoguename[whichdialogue][indialogue][i] == '#' || dialoguename[whichdialogue][indialogue][i] == '\0')goodchar = 0;
+ if (goodchar)
tempnum++;
else
- tempname[tempnum]='\0';
+ tempname[tempnum] = '\0';
}
sprintf (string, "%s: ", tempname);
- if(dialogueboxcolor[whichdialogue][indialogue][0]+dialogueboxcolor[whichdialogue][indialogue][1]+dialogueboxcolor[whichdialogue][indialogue][2]<1.5){
- glColor4f(0,0,0,tutorialopac);
- text->glPrintOutline(startx-2*7.6*strlen(string)*screenwidth/1024-4,starty-4,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
- glColor4f(0.7,0.7,0.7,tutorialopac);
- text->glPrint(startx-2*7.6*strlen(string)*screenwidth/1024,starty,string,1,1.5*screenwidth/1024,screenwidth,screenheight);
- }
- else
- {
- glColor4f(0,0,0,tutorialopac);
- text->glPrintOutline(startx-2*7.6*strlen(string)*screenwidth/1024-4,starty-4,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
+ if (dialogueboxcolor[whichdialogue][indialogue][0] + dialogueboxcolor[whichdialogue][indialogue][1] + dialogueboxcolor[whichdialogue][indialogue][2] < 1.5) {
+ glColor4f(0, 0, 0, tutorialopac);
+ text->glPrintOutline(startx - 2 * 7.6 * strlen(string)*screenwidth / 1024 - 4, starty - 4, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
+ glColor4f(0.7, 0.7, 0.7, tutorialopac);
+ text->glPrint(startx - 2 * 7.6 * strlen(string)*screenwidth / 1024, starty, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight);
+ } else {
+ glColor4f(0, 0, 0, tutorialopac);
+ text->glPrintOutline(startx - 2 * 7.6 * strlen(string)*screenwidth / 1024 - 4, starty - 4, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
}
- tempnum=0;
- for(i=0;i<(int)strlen(dialoguetext[whichdialogue][indialogue])+1;i++){
- tempname[tempnum]=dialoguetext[whichdialogue][indialogue][i];
- if(dialoguetext[whichdialogue][indialogue][i]!='#')tempnum++;
+ tempnum = 0;
+ for (i = 0; i < (int)strlen(dialoguetext[whichdialogue][indialogue]) + 1; i++) {
+ tempname[tempnum] = dialoguetext[whichdialogue][indialogue][i];
+ if (dialoguetext[whichdialogue][indialogue][i] != '#')tempnum++;
}
sprintf (string, "%s", tempname);
int lastline = 0;
int line = 0;
bool done = false;
- i=0;
- while(!done){
- if(string[i]=='\n'||string[i]>'z'||string[i]<' '||string[i]=='\0'){
- if(dialogueboxcolor[whichdialogue][indialogue][0]+dialogueboxcolor[whichdialogue][indialogue][1]+dialogueboxcolor[whichdialogue][indialogue][2]<1.5){
- glColor4f(0,0,0,tutorialopac);
- text->glPrintOutline(startx/*-7.6*(i-lastline)*screenwidth/1024*/-4,starty-4-20*screenwidth/1024*line,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight,lastline,i);
- glColor4f(1,1,1,tutorialopac);
- text->glPrint(startx/*-7.6*(i-lastline)*screenwidth/1024*/,starty-20*screenwidth/1024*line,string,1,1.5*screenwidth/1024,screenwidth,screenheight,lastline,i);
- }
- else
- {
- glColor4f(0,0,0,tutorialopac);
- text->glPrint(startx/*-7.6*(i-lastline)*screenwidth/1024*/,starty-20*screenwidth/1024*line,string,1,1.5*screenwidth/1024,screenwidth,screenheight,lastline,i);
+ i = 0;
+ while (!done) {
+ if (string[i] == '\n' || string[i] > 'z' || string[i] < ' ' || string[i] == '\0') {
+ if (dialogueboxcolor[whichdialogue][indialogue][0] + dialogueboxcolor[whichdialogue][indialogue][1] + dialogueboxcolor[whichdialogue][indialogue][2] < 1.5) {
+ glColor4f(0, 0, 0, tutorialopac);
+ text->glPrintOutline(startx/*-7.6*(i-lastline)*screenwidth/1024*/ - 4, starty - 4 - 20 * screenwidth / 1024 * line, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
+ glColor4f(1, 1, 1, tutorialopac);
+ text->glPrint(startx/*-7.6*(i-lastline)*screenwidth/1024*/, starty - 20 * screenwidth / 1024 * line, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
+ } else {
+ glColor4f(0, 0, 0, tutorialopac);
+ text->glPrint(startx/*-7.6*(i-lastline)*screenwidth/1024*/, starty - 20 * screenwidth / 1024 * line, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
}
- lastline=i+1;
+ lastline = i + 1;
line++;
- if(string[i]=='\0')done=1;
+ if (string[i] == '\0')done = 1;
}
- if(i>=255)done=1;
+ if (i >= 255)done = 1;
i++;
}
}
- if(!tutoriallevel&&!winfreeze&&indialogue==-1&&!mainmenu){
- if(campaign){
- if(scoreadded)
+ if (!tutoriallevel && !winfreeze && indialogue == -1 && !mainmenu) {
+ if (campaign) {
+ if (scoreadded)
sprintf (string, "Score: %d", (int)accountactive->getCampaignScore());
else
- sprintf (string, "Score: %d", (int)accountactive->getCampaignScore()+(int)bonustotal);
- }
- if(!campaign)sprintf (string, "Score: %d", (int)bonustotal);
- glColor4f(0,0,0,1);
- text->glPrintOutline(1024/40-4,768/16-4+768*14/16,string,1,1.5*1.25,1024,768);
- glColor4f(1,0,0,1);
- text->glPrint(1024/40,768/16+768*14/16,string,1,1.5,1024,768);
- if(showdamagebar) {
+ sprintf (string, "Score: %d", (int)accountactive->getCampaignScore() + (int)bonustotal);
+ }
+ if (!campaign)sprintf (string, "Score: %d", (int)bonustotal);
+ glColor4f(0, 0, 0, 1);
+ text->glPrintOutline(1024 / 40 - 4, 768 / 16 - 4 + 768 * 14 / 16, string, 1, 1.5 * 1.25, 1024, 768);
+ glColor4f(1, 0, 0, 1);
+ text->glPrint(1024 / 40, 768 / 16 + 768 * 14 / 16, string, 1, 1.5, 1024, 768);
+ if (showdamagebar) {
glDisable(GL_DEPTH_TEST); // Disables Depth Testing
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPushMatrix(); // Store The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPushMatrix(); // Store The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
- glTranslatef(15,screenheight*17.5/20,0);
- glScalef(screenwidth/3+20,screenheight/20,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ glTranslatef(15, screenheight * 17.5 / 20, 0);
+ glScalef(screenwidth / 3 + 20, screenheight / 20, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- glColor4f(0.0,0.4,0.0,0.7);
- float bar=((float)player[0].damage)/player[0].damagetolerance;
+ glColor4f(0.0, 0.4, 0.0, 0.7);
+ float bar = ((float)player[0].damage) / player[0].damagetolerance;
glBegin(GL_QUADS);
- glVertex3f((bar<1?bar:1),0,0.0f);
- glVertex3f(1,0,0.0f);
- glVertex3f(1,1,0.0f);
- glVertex3f((bar<1?bar:1),1,0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+ glVertex3f(1, 0, 0.0f);
+ glVertex3f(1, 1, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
glEnd();
- glColor4f(0.1,0.0,0.0,1);
- bar = ((float)player[0].bloodloss)/player[0].damagetolerance;
+ glColor4f(0.1, 0.0, 0.0, 1);
+ bar = ((float)player[0].bloodloss) / player[0].damagetolerance;
glBegin(GL_QUADS);
- glVertex3f(0,0,0.0f);
- glVertex3f((bar<1?bar:1),0,0.0f);
- glVertex3f((bar<1?bar:1),1,0.0f);
- glVertex3f(0,1,0.0f);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
+ glVertex3f(0, 1, 0.0f);
glEnd();
- glColor4f(0.4,0.0,0.0,0.7);
- bar = ((float)player[0].damage)/player[0].damagetolerance;
+ glColor4f(0.4, 0.0, 0.0, 0.7);
+ bar = ((float)player[0].damage) / player[0].damagetolerance;
glBegin(GL_QUADS);
- glVertex3f(0,0,0.0f);
- glVertex3f((bar<1?bar:1),0,0.0f);
- glVertex3f((bar<1?bar:1),1,0.0f);
- glVertex3f(0,1,0.0f);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
+ glVertex3f(0, 1, 0.0f);
glEnd();
- glColor4f(0.4,0.0,0.0,0.7);
- bar = ((float)player[0].permanentdamage)/player[0].damagetolerance;
+ glColor4f(0.4, 0.0, 0.0, 0.7);
+ bar = ((float)player[0].permanentdamage) / player[0].damagetolerance;
glBegin(GL_QUADS);
- glVertex3f(0,0,0.0f);
- glVertex3f((bar<1?bar:1),0,0.0f);
- glVertex3f((bar<1?bar:1),1,0.0f);
- glVertex3f(0,1,0.0f);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
+ glVertex3f(0, 1, 0.0f);
glEnd();
- glColor4f(0.4,0.0,0.0,0.7);
- bar = ((float)player[0].superpermanentdamage)/player[0].damagetolerance;
+ glColor4f(0.4, 0.0, 0.0, 0.7);
+ bar = ((float)player[0].superpermanentdamage) / player[0].damagetolerance;
glBegin(GL_QUADS);
- glVertex3f(0,0,0.0f);
- glVertex3f((bar<1?bar:1),0,0.0f);
- glVertex3f((bar<1?bar:1),1,0.0f);
- glVertex3f(0,1,0.0f);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+ glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
+ glVertex3f(0, 1, 0.0f);
glEnd();
- glColor4f(0.0,0.0,0.0,0.7);
+ glColor4f(0.0, 0.0, 0.0, 0.7);
glLineWidth(2.0);
glBegin(GL_LINE_STRIP);
- glVertex3f(0,0,0.0f);
- glVertex3f(1,0,0.0f);
- glVertex3f(1,1,0.0f);
- glVertex3f(0,1,0.0f);
- glVertex3f(0,0,0.0f);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f(1, 0, 0.0f);
+ glVertex3f(1, 1, 0.0f);
+ glVertex3f(0, 1, 0.0f);
+ glVertex3f(0, 0, 0.0f);
glEnd();
-
+
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glDisable(GL_BLEND);
glDepthMask(1);
glEnable(GL_TEXTURE_2D);
-
- // writing the numbers :
- sprintf (string, "Damages : %d/%d (%d)",(int)(player[0].damage),(int)(player[0].damagetolerance),(int)(player[0].bloodloss));
- glColor4f(0,0,0,1);
- text->glPrintOutline(1024/40-4,768/16-4+768*14/16-40,string,1,1.5*1.25,1024,768);
- glColor4f(1,0,0,1);
- text->glPrint(1024/40,768/16+768*14/16-40,string,1,1.5,1024,768);
+
+ // writing the numbers :
+ sprintf (string, "Damages : %d/%d (%d)", (int)(player[0].damage), (int)(player[0].damagetolerance), (int)(player[0].bloodloss));
+ glColor4f(0, 0, 0, 1);
+ text->glPrintOutline(1024 / 40 - 4, 768 / 16 - 4 + 768 * 14 / 16 - 40, string, 1, 1.5 * 1.25, 1024, 768);
+ glColor4f(1, 0, 0, 1);
+ text->glPrint(1024 / 40, 768 / 16 + 768 * 14 / 16 - 40, string, 1, 1.5, 1024, 768);
}
}
- glColor4f(.5,.5,.5,1);
+ glColor4f(.5, .5, .5, 1);
- if((texttoggle||editorenabled)&&debugmode&&!mainmenu){
- sprintf (string, "The framespersecond is %d.",(int)(fps));
- text->glPrint(10,30,string,0,.8,1024,768);
+ if ((texttoggle || editorenabled) && debugmode && !mainmenu) {
+ sprintf (string, "The framespersecond is %d.", (int)(fps));
+ text->glPrint(10, 30, string, 0, .8, 1024, 768);
- if(editorenabled)
+ if (editorenabled)
sprintf (string, "Map editor enabled.");
else
sprintf (string, "Map editor disabled.");
- text->glPrint(10,60,string,0,.8,1024,768);
- if(editorenabled){
- sprintf (string, "Object size: %f",editorsize);
- text->glPrint(10,75,string,0,.8,1024,768);
- if(editoryaw>=0)sprintf (string, "Object yaw: %f",editoryaw);
+ text->glPrint(10, 60, string, 0, .8, 1024, 768);
+ if (editorenabled) {
+ sprintf (string, "Object size: %f", editorsize);
+ text->glPrint(10, 75, string, 0, .8, 1024, 768);
+ if (editoryaw >= 0)sprintf (string, "Object yaw: %f", editoryaw);
else sprintf (string, "Object yaw: Random");
- text->glPrint(10,90,string,0,.8,1024,768);
- if(editorpitch>=0)sprintf (string, "Object pitch: %f",editorpitch);
+ text->glPrint(10, 90, string, 0, .8, 1024, 768);
+ if (editorpitch >= 0)sprintf (string, "Object pitch: %f", editorpitch);
else sprintf (string, "Object pitch: Random");
- text->glPrint(10,105,string,0,.8,1024,768);
- sprintf (string, "Object type: %d",editortype);
- text->glPrint(10,120,string,0,.8,1024,768);
- switch(editortype) {
- case boxtype:
- sprintf (string, "(box)");
- break;
- case treetrunktype:
- sprintf (string, "(tree)");
- break;
- case walltype:
- sprintf (string, "(wall)");
- break;
- case weirdtype:
- sprintf (string, "(weird)");
- break;
- case spiketype:
- sprintf (string, "(spike)");
- break;
- case rocktype:
- sprintf (string, "(rock)");
- break;
- case bushtype:
- sprintf (string, "(bush)");
- break;
- case tunneltype:
- sprintf (string, "(tunnel)");
- break;
- case chimneytype:
- sprintf (string, "(chimney)");
- break;
- case platformtype:
- sprintf (string, "(platform)");
- break;
- case cooltype:
- sprintf (string, "(cool)");
- break;
- case firetype:
- sprintf (string, "(fire)");
- break;
+ text->glPrint(10, 105, string, 0, .8, 1024, 768);
+ sprintf (string, "Object type: %d", editortype);
+ text->glPrint(10, 120, string, 0, .8, 1024, 768);
+ switch (editortype) {
+ case boxtype:
+ sprintf (string, "(box)");
+ break;
+ case treetrunktype:
+ sprintf (string, "(tree)");
+ break;
+ case walltype:
+ sprintf (string, "(wall)");
+ break;
+ case weirdtype:
+ sprintf (string, "(weird)");
+ break;
+ case spiketype:
+ sprintf (string, "(spike)");
+ break;
+ case rocktype:
+ sprintf (string, "(rock)");
+ break;
+ case bushtype:
+ sprintf (string, "(bush)");
+ break;
+ case tunneltype:
+ sprintf (string, "(tunnel)");
+ break;
+ case chimneytype:
+ sprintf (string, "(chimney)");
+ break;
+ case platformtype:
+ sprintf (string, "(platform)");
+ break;
+ case cooltype:
+ sprintf (string, "(cool)");
+ break;
+ case firetype:
+ sprintf (string, "(fire)");
+ break;
}
- text->glPrint(130,120,string,0,.8,1024,768);
+ text->glPrint(130, 120, string, 0, .8, 1024, 768);
- sprintf (string, "Numplayers: %d",numplayers);
- text->glPrint(10,155,string,0,.8,1024,768);
- sprintf (string, "Player %d: numwaypoints: %d",numplayers,player[numplayers-1].numwaypoints);
- text->glPrint(10,140,string,0,.8,1024,768);
+ sprintf (string, "Numplayers: %d", numplayers);
+ text->glPrint(10, 155, string, 0, .8, 1024, 768);
+ sprintf (string, "Player %d: numwaypoints: %d", numplayers, player[numplayers - 1].numwaypoints);
+ text->glPrint(10, 140, string, 0, .8, 1024, 768);
}
- sprintf (string, "Difficulty: %d",difficulty);
- text->glPrint(10,240,string,0,.8,1024,768);
+ sprintf (string, "Difficulty: %d", difficulty);
+ text->glPrint(10, 240, string, 0, .8, 1024, 768);
}
- }
-
- if(drawmode==glowmode){
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef(screenwidth,screenheight,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glColor4f(0,0,0,.5);
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0.0f);
- glVertex3f(256, 0, 0.0f);
- glVertex3f(256, 256, 0.0f);
- glVertex3f(0, 256, 0.0f);
- glEnd();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glDepthMask(1);
- }
-
- if((((blackout&&damageeffects)||(player[0].bloodloss>0&&damageeffects&&player[0].blooddimamount>0)||player[0].dead)&&!cameramode)||console){
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef(screenwidth,screenheight,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- if(player[0].dead)blackout+=multiplier*3;
- if(player[0].dead==1)blackout=.4f;
- if(player[0].dead==2&&blackout>.6)blackout=.6;
- glColor4f(0,0,0,blackout);
- if(!player[0].dead){
- if((player[0].bloodloss/player[0].damagetolerance*(sin(woozy)/4+.5))*.3<.3){
- glColor4f(0,0,0,player[0].blooddimamount*player[0].bloodloss/player[0].damagetolerance*(sin(woozy)/4+.5)*.3);
- blackout=player[0].blooddimamount*player[0].bloodloss/player[0].damagetolerance*(sin(woozy)/4+.5)*.3;
- }
- else {
- glColor4f(0,0,0,player[0].blooddimamount*.3);
- blackout=player[0].blooddimamount*.3;
- }
- }
- if(console)glColor4f(.7,0,0,.2);
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0.0f);
- glVertex3f(256, 0, 0.0f);
- glVertex3f(256, 256, 0.0f);
- glVertex3f(0, 256, 0.0f);
- glEnd();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glDepthMask(1);
- }
-
- if(flashamount>0&&damageeffects) {
- if(flashamount>1)flashamount=1;
- if(flashdelay<=0)flashamount-=multiplier;
- flashdelay--;
- if(flashamount<0)flashamount=0;
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef(screenwidth,screenheight,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glColor4f(flashr,flashg,flashb,flashamount);
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0.0f);
- glVertex3f(256, 0, 0.0f);
- glVertex3f(256, 256, 0.0f);
- glVertex3f(0, 256, 0.0f);
- glEnd();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glDepthMask(1);
- }
-
- if(!console) {
- displaytime[0]=0;
- glEnable(GL_TEXTURE_2D);
- glColor4f(1,1,1,1);
- if(chatting){
- sprintf (string, " ]");
- text->glPrint(10,30+screenheight-330,string,0,1,screenwidth,screenheight);
- if(displayblink){
- sprintf (string, "_");
- text->glPrint(30+(float)(displayselected)*10,30+(screenheight-330),string,0,1,screenwidth,screenheight);
- }
- }
- for(i=0;i<15;i++)
- if((i!=0||chatting)&&displaytime[i]<4)
- for(j=0;j<displaychars[i];j++) {
- glColor4f(1,1,1,4-displaytime[i]);
- if(j<displaychars[i]) {
- sprintf (string, "%c",displaytext[i][j]);
- text->glPrint(30+j*10,30+i*20+(screenheight-330),string,0,1,screenwidth,screenheight);
- }
- }
- }
-
- if(difficulty<2&&indialogue==-1){ // minimap
- float mapviewdist = 20000;
-
- glDisable(GL_DEPTH_TEST);
- glColor3f (1.0, 1.0, 1.0); // no coloring
-
- glEnable(GL_TEXTURE_2D);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef((float)screenwidth/2,(float)screenwidth/2,1);
- glTranslatef(1.75,.25,0);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glColor4f(1,1,1,1);
- glPushMatrix();
- float opac = .7;
- XYZ center;
- float radius;
- float distcheck;
- int numliveplayers=0;
- center = 0;
- for(i=0;i<numplayers;i++){
- if(!player[i].dead) numliveplayers++;
- }
-
- int numadd = 0;
-
- for(i=0;i<objects.numobjects;i++){
- if(objects.type[i]==treetrunktype||objects.type[i]==boxtype){
- center+=objects.position[i];
- numadd++;
- }
- }
- for(i=0;i<numplayers;i++){
- if(!player[i].dead)center+=player[i].coords;
- }
- center/=numadd+numliveplayers;
-
- center=player[0].coords;
-
- float maxdistance=0;
- float tempdist;
- //~ int whichclosest;
- for(i=0;i<objects.numobjects;i++){
- tempdist=distsq(¢er,&objects.position[i]);
- if(tempdist>maxdistance){
- //~ whichclosest=i;
- maxdistance=tempdist;
- }
- }
- for(i=0;i<numplayers;i++){
- if(!player[i].dead){
- tempdist=distsq(¢er,&player[i].coords);
- if(tempdist>maxdistance){
- //~ whichclosest=i;
- maxdistance=tempdist;
- }
- }
- }
- radius=fast_sqrt(maxdistance);
-
- radius=110;
-
- glScalef(.25/radius*256*terrain.scale*.4,.25/radius*256*terrain.scale*.4,1);
- glPushMatrix();
- glScalef(1/(1/radius*256*terrain.scale*.4),1/(1/radius*256*terrain.scale*.4),1);
- glPopMatrix();
- glRotatef(player[0].lookyaw*-1+180,0,0,1);
- glTranslatef(-(center.x/terrain.scale/256*-2+1),(center.z/terrain.scale/256*-2+1),0);
- for(i=0;i<objects.numobjects;i++){
- if(objects.type[i]==treetrunktype){
- distcheck=distsq(&player[0].coords,&objects.position[i]);
- if(distcheck<mapviewdist){
+ }
+
+ if (drawmode == glowmode) {
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef(screenwidth, screenheight, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(0, 0, 0, .5);
+ glBegin(GL_QUADS);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f(256, 0, 0.0f);
+ glVertex3f(256, 256, 0.0f);
+ glVertex3f(0, 256, 0.0f);
+ glEnd();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+ }
+
+ if ((((blackout && damageeffects) || (player[0].bloodloss > 0 && damageeffects && player[0].blooddimamount > 0) || player[0].dead) && !cameramode) || console) {
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef(screenwidth, screenheight, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ if (player[0].dead)blackout += multiplier * 3;
+ if (player[0].dead == 1)blackout = .4f;
+ if (player[0].dead == 2 && blackout > .6)blackout = .6;
+ glColor4f(0, 0, 0, blackout);
+ if (!player[0].dead) {
+ if ((player[0].bloodloss / player[0].damagetolerance * (sin(woozy) / 4 + .5))*.3 < .3) {
+ glColor4f(0, 0, 0, player[0].blooddimamount * player[0].bloodloss / player[0].damagetolerance * (sin(woozy) / 4 + .5)*.3);
+ blackout = player[0].blooddimamount * player[0].bloodloss / player[0].damagetolerance * (sin(woozy) / 4 + .5) * .3;
+ } else {
+ glColor4f(0, 0, 0, player[0].blooddimamount * .3);
+ blackout = player[0].blooddimamount * .3;
+ }
+ }
+ if (console)glColor4f(.7, 0, 0, .2);
+ glBegin(GL_QUADS);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f(256, 0, 0.0f);
+ glVertex3f(256, 256, 0.0f);
+ glVertex3f(0, 256, 0.0f);
+ glEnd();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+ }
+
+ if (flashamount > 0 && damageeffects) {
+ if (flashamount > 1)flashamount = 1;
+ if (flashdelay <= 0)flashamount -= multiplier;
+ flashdelay--;
+ if (flashamount < 0)flashamount = 0;
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef(screenwidth, screenheight, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(flashr, flashg, flashb, flashamount);
+ glBegin(GL_QUADS);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f(256, 0, 0.0f);
+ glVertex3f(256, 256, 0.0f);
+ glVertex3f(0, 256, 0.0f);
+ glEnd();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+ }
+
+ if (!console) {
+ displaytime[0] = 0;
+ glEnable(GL_TEXTURE_2D);
+ glColor4f(1, 1, 1, 1);
+ if (chatting) {
+ sprintf (string, " ]");
+ text->glPrint(10, 30 + screenheight - 330, string, 0, 1, screenwidth, screenheight);
+ if (displayblink) {
+ sprintf (string, "_");
+ text->glPrint(30 + (float)(displayselected) * 10, 30 + (screenheight - 330), string, 0, 1, screenwidth, screenheight);
+ }
+ }
+ for (i = 0; i < 15; i++)
+ if ((i != 0 || chatting) && displaytime[i] < 4)
+ for (j = 0; j < displaychars[i]; j++) {
+ glColor4f(1, 1, 1, 4 - displaytime[i]);
+ if (j < displaychars[i]) {
+ sprintf (string, "%c", displaytext[i][j]);
+ text->glPrint(30 + j * 10, 30 + i * 20 + (screenheight - 330), string, 0, 1, screenwidth, screenheight);
+ }
+ }
+ }
+
+ if (difficulty < 2 && indialogue == -1) { // minimap
+ float mapviewdist = 20000;
+
+ glDisable(GL_DEPTH_TEST);
+ glColor3f (1.0, 1.0, 1.0); // no coloring
+
+ glEnable(GL_TEXTURE_2D);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef((float)screenwidth / 2, (float)screenwidth / 2, 1);
+ glTranslatef(1.75, .25, 0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(1, 1, 1, 1);
+ glPushMatrix();
+ float opac = .7;
+ XYZ center;
+ float radius;
+ float distcheck;
+ int numliveplayers = 0;
+ center = 0;
+ for (i = 0; i < numplayers; i++) {
+ if (!player[i].dead) numliveplayers++;
+ }
+
+ int numadd = 0;
+
+ for (i = 0; i < objects.numobjects; i++) {
+ if (objects.type[i] == treetrunktype || objects.type[i] == boxtype) {
+ center += objects.position[i];
+ numadd++;
+ }
+ }
+ for (i = 0; i < numplayers; i++) {
+ if (!player[i].dead)center += player[i].coords;
+ }
+ center /= numadd + numliveplayers;
+
+ center = player[0].coords;
+
+ float maxdistance = 0;
+ float tempdist;
+ //~ int whichclosest;
+ for (i = 0; i < objects.numobjects; i++) {
+ tempdist = distsq(¢er, &objects.position[i]);
+ if (tempdist > maxdistance) {
+ //~ whichclosest=i;
+ maxdistance = tempdist;
+ }
+ }
+ for (i = 0; i < numplayers; i++) {
+ if (!player[i].dead) {
+ tempdist = distsq(¢er, &player[i].coords);
+ if (tempdist > maxdistance) {
+ //~ whichclosest=i;
+ maxdistance = tempdist;
+ }
+ }
+ }
+ radius = fast_sqrt(maxdistance);
+
+ radius = 110;
+
+ glScalef(.25 / radius * 256 * terrain.scale * .4, .25 / radius * 256 * terrain.scale * .4, 1);
+ glPushMatrix();
+ glScalef(1 / (1 / radius * 256 * terrain.scale * .4), 1 / (1 / radius * 256 * terrain.scale * .4), 1);
+ glPopMatrix();
+ glRotatef(player[0].lookyaw * -1 + 180, 0, 0, 1);
+ glTranslatef(-(center.x / terrain.scale / 256 * -2 + 1), (center.z / terrain.scale / 256 * -2 + 1), 0);
+ for (i = 0; i < objects.numobjects; i++) {
+ if (objects.type[i] == treetrunktype) {
+ distcheck = distsq(&player[0].coords, &objects.position[i]);
+ if (distcheck < mapviewdist) {
Mapcircletexture.bind();
- glColor4f(0,.3,0,opac*(1-distcheck/mapviewdist));
- glPushMatrix();
- glTranslatef(objects.position[i].x/terrain.scale/256*-2+1,objects.position[i].z/terrain.scale/256*2-1,0);
- glRotatef(objects.yaw[i],0,0,1);
- glScalef(.003,.003,.003);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(1,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(1,1);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,1);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- }
- }
- if(objects.type[i]==boxtype){
- distcheck=distsq(&player[0].coords,&objects.position[i]);
- if(distcheck<mapviewdist){
- Mapboxtexture.bind();
- glColor4f(.4,.4,.4,opac*(1-distcheck/mapviewdist));
- glPushMatrix();
- glTranslatef(objects.position[i].x/terrain.scale/256*-2+1,objects.position[i].z/terrain.scale/256*2-1,0);
- glRotatef(objects.yaw[i],0,0,1);
- glScalef(.01*objects.scale[i],.01*objects.scale[i],.01*objects.scale[i]);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(1,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(1,1);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,1);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- }
- }
- }
- if(editorenabled){
- Mapcircletexture.bind();
- for(i=0;i<numboundaries;i++){
- glColor4f(0,0,0,opac/3);
- glPushMatrix();
- glTranslatef(boundary[i].x/terrain.scale/256*-2+1,boundary[i].z/terrain.scale/256*2-1,0);
- glScalef(.002,.002,.002);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(1,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(1,1);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,1);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- }
- }
- for(i=0;i<numplayers;i++){
- distcheck=distsq(&player[0].coords,&player[i].coords);
- if(distcheck<mapviewdist){
- glPushMatrix();
+ glColor4f(0, .3, 0, opac * (1 - distcheck / mapviewdist));
+ glPushMatrix();
+ glTranslatef(objects.position[i].x / terrain.scale / 256 * -2 + 1, objects.position[i].z / terrain.scale / 256 * 2 - 1, 0);
+ glRotatef(objects.yaw[i], 0, 0, 1);
+ glScalef(.003, .003, .003);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(1, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(1, 1);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, 1);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ }
+ if (objects.type[i] == boxtype) {
+ distcheck = distsq(&player[0].coords, &objects.position[i]);
+ if (distcheck < mapviewdist) {
+ Mapboxtexture.bind();
+ glColor4f(.4, .4, .4, opac * (1 - distcheck / mapviewdist));
+ glPushMatrix();
+ glTranslatef(objects.position[i].x / terrain.scale / 256 * -2 + 1, objects.position[i].z / terrain.scale / 256 * 2 - 1, 0);
+ glRotatef(objects.yaw[i], 0, 0, 1);
+ glScalef(.01 * objects.scale[i], .01 * objects.scale[i], .01 * objects.scale[i]);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(1, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(1, 1);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, 1);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ }
+ }
+ if (editorenabled) {
+ Mapcircletexture.bind();
+ for (i = 0; i < numboundaries; i++) {
+ glColor4f(0, 0, 0, opac / 3);
+ glPushMatrix();
+ glTranslatef(boundary[i].x / terrain.scale / 256 * -2 + 1, boundary[i].z / terrain.scale / 256 * 2 - 1, 0);
+ glScalef(.002, .002, .002);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(1, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(1, 1);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, 1);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ }
+ for (i = 0; i < numplayers; i++) {
+ distcheck = distsq(&player[0].coords, &player[i].coords);
+ if (distcheck < mapviewdist) {
+ glPushMatrix();
Maparrowtexture.bind();
- if(i==0)glColor4f(1,1,1,opac);
- else if(player[i].dead==2||player[i].howactive>typesleeping)glColor4f(0,0,0,opac*(1-distcheck/mapviewdist));
- else if(player[i].dead)glColor4f(.3,.3,.3,opac*(1-distcheck/mapviewdist));
- else if(player[i].aitype==attacktypecutoff)glColor4f(1,0,0,opac*(1-distcheck/mapviewdist));
- else if(player[i].aitype==passivetype)glColor4f(0,1,0,opac*(1-distcheck/mapviewdist));
- else glColor4f(1,1,0,1);
- glTranslatef(player[i].coords.x/terrain.scale/256*-2+1,player[i].coords.z/terrain.scale/256*2-1,0);
- glRotatef(player[i].yaw+180,0,0,1);
- glScalef(.005,.005,.005);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(1,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(1,1);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,1);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- }
- }
- glPopMatrix();
- glDisable(GL_TEXTURE_2D);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glDepthMask(1);
- }
-
- if(loading&&!stealthloading&&(!campaign||player[0].dead)){
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef(screenwidth,screenheight,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glColor4f(0,0,0,.7);
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0.0f);
- glVertex3f(256, 0, 0.0f);
- glVertex3f(256, 256, 0.0f);
- glVertex3f(0, 256, 0.0f);
- glEnd();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glDepthMask(1);
-
- //logo
- glDisable(GL_DEPTH_TEST);
- glColor3f (1.0, 1.0, 1.0); // no coloring
-
- glEnable(GL_TEXTURE_2D);
-
- //Minimap
-
- if(loading!=4){
- glEnable(GL_TEXTURE_2D);
- glColor4f(1,1,1,1);
- sprintf (string, "Loading...");
- text->glPrint(1024/2-90,768/2,string,1,2,1024,768);
- }
- loading=2;
- //if(ismotionblur)drawmode=motionblurmode;
- drawmode=normalmode;
- }
-
- if(winfreeze&&!campaign){
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef(screenwidth,screenheight,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glColor4f(0,0,0,.4);
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0.0f);
- glVertex3f(256, 0, 0.0f);
- glVertex3f(256, 256, 0.0f);
- glVertex3f(0, 256, 0.0f);
- glEnd();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glDepthMask(1);
-
- //logo
- glDisable(GL_DEPTH_TEST);
- glColor3f (1.0, 1.0, 1.0); // no coloring
-
- glEnable(GL_TEXTURE_2D);
-
- //Win Screen Won Victory
-
- glEnable(GL_TEXTURE_2D);
- glColor4f(1,1,1,1);
- sprintf (string, "Level Cleared!");
- text->glPrintOutlined(1024/2-strlen(string)*10,768*7/8,string,1,2,1024,768);
-
- sprintf (string, "Score: %d",(int)(bonustotal-startbonustotal));
- text->glPrintOutlined(1024/30,768*6/8,string,1,2,1024,768);
-
- if(campaign)
- sprintf (string, "Press Escape or Space to continue");
- else
- sprintf (string, "Press Escape to return to menu or Space to continue");
- text->glPrintOutlined(640/2-strlen(string)*5,480*1/16,string,1,1,640,480);
-
- char temp[255];
-
- for(i=0;i<255;i++)string[i]='\0';
- sprintf (temp, "Time: %d:",(int)(((int)leveltime-(int)(leveltime)%60)/60));
- strcat(string,temp);
- if((int)(leveltime)%60<10)strcat(string,"0");
- sprintf (temp, "%d",(int)(leveltime)%60);
- strcat(string,temp);
- text->glPrintOutlined(1024/30,768*6/8-40,string,1,2,1024,768);
-
- //Awards
- int awards[award_count];
- int numawards = award_awards(awards);
-
- for (i = 0; i < numawards && i < 6; i++)
- text->glPrintOutlined(1024/30,768*6/8-90-40*i,award_names[awards[i]],1,2,1024,768);
- }
-
- if(drawmode!=normalmode){
- glEnable(GL_TEXTURE_2D);
- glFinish();
- if(!drawtoggle||drawmode!=realmotionblurmode||(drawtoggle==2||change==1)){
- if(screentexture){
-
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
- GLfloat subtractColor[4] = { 0.5, 0.5, 0.5, 0.0 };
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, subtractColor);
- //glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_SUBTRACT);
- glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
- glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_CONSTANT_EXT);
- glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2.0f);
-
- glBindTexture( GL_TEXTURE_2D, screentexture);
- glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texviewwidth, texviewheight);
- }
- }
- if((drawtoggle||change==1)&&drawmode==realmotionblurmode){
- if(screentexture2){
- glBindTexture( GL_TEXTURE_2D, screentexture2);
- glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texviewwidth, texviewheight);
- }
- if(!screentexture2){
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
-
- glGenTextures( 1, &screentexture2 );
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-
- glEnable(GL_TEXTURE_2D);
- glBindTexture( GL_TEXTURE_2D, screentexture2);
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-
- glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kTextureSize, kTextureSize, 0);
- }
- }
- //glFlush();
- }
-
- glClear(GL_DEPTH_BUFFER_BIT);
- Game::ReSizeGLScene(90,.1f);
- glViewport(0,0,screenwidth,screenheight);
-
- if(drawmode!=normalmode){
- glDisable(GL_DEPTH_TEST);
- if(drawmode==motionblurmode){
- glDrawBuffer(GL_FRONT);
- glReadBuffer(GL_BACK);
- }
- glColor3f (1.0, 1.0, 1.0); // no coloring
-
- glEnable(GL_TEXTURE_2D);
- glBindTexture( GL_TEXTURE_2D, screentexture);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef((float)screenwidth/2,(float)screenheight/2,1);
- glTranslatef(1,1,0);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- if(drawmode==motionblurmode){
- if(motionbluramount<.2)motionbluramount=.2;
- //glColor4f(1,1,1,fast_sqrt(multiplier)*2.9*motionbluramount);
- glColor4f(1,1,1,motionbluramount);
- glPushMatrix();
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- }
- if(drawmode==realmotionblurmode){
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glBindTexture( GL_TEXTURE_2D, screentexture);
- glColor4f(1,1,1,.5);
- glPushMatrix();
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glBindTexture( GL_TEXTURE_2D, screentexture2);
- glColor4f(1,1,1,.5);
- glPushMatrix();
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- if(drawmode==doublevisionmode){
- static float crosseyedness;
- crosseyedness=abs(player[0].damage-player[0].superpermanentdamage-(player[0].damagetolerance-player[0].superpermanentdamage)*1/2)/30;
- if(crosseyedness>1)crosseyedness=1;
- if(crosseyedness<0)crosseyedness=0;
- glColor4f(1,1,1,1);
- glDisable(GL_BLEND);
- glPushMatrix();
- glScalef(1,1,1);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- if(crosseyedness){
- glColor4f(1,1,1,.5);
- glEnable(GL_BLEND);
- glPushMatrix();
- glTranslatef(.015*crosseyedness,0,0);
- glScalef(1,1,1);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- }
- }
- if(drawmode==glowmode){
- glColor4f(.5,.5,.5,.5);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glPushMatrix();
- glTranslatef(.01,0,0);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glPushMatrix();
- glTranslatef(-.01,0,0);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glPushMatrix();
- glTranslatef(.0,.01,0);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0,-.01,0);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- }
- if(drawmode==radialzoommode){
- for(i=0;i<3;i++){
- //glRotatef((float)i*.1,0,0,1);
- glColor4f(1,1,1,1/((float)i+1));
- glPushMatrix();
- glScalef(1+(float)i*.01,1+(float)i*.01,1);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(texcoordwidth,texcoordheight);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,texcoordheight);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- }
- }
- glDisable(GL_TEXTURE_2D);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glDepthMask(1);
- }
-
- if(console){
- glEnable(GL_TEXTURE_2D);
- glColor4f(1,1,1,1);
- int offset = 0;
- if(consoleselected>=60)
- offset=consoleselected-60;
- sprintf (string, " ]");
- text->glPrint(10,30,string,0,1,1024,768);
- if(consoleblink){
- sprintf (string, "_");
- text->glPrint(30+(float)(consoleselected)*10-offset*10,30,string,0,1,1024,768);
- }
- for(i=0;i<15;i++)
- for(j=0;j<consolechars[i];j++){
- glColor4f(1,1,1,1-(float)(i)/16);
- if(j<consolechars[i]){
- sprintf (string, "%c",consoletext[i][j]);
- text->glPrint(30+j*10-offset*10,30+i*20,string,0,1,1024,768);
- }
- }
- }
- }
-
- if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){
- multiplier=tempmult;
- }
-
- if(mainmenu){
- DrawMenu();
- }
-
- if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){
- tempmult=multiplier;
- multiplier=0;
- }
-
- //glFlush();
- if ( side == stereoRight || side == stereoCenter ) {
- if(drawmode!=motionblurmode||mainmenu){
- swap_gl_buffers();
- }
- }
-
- //myassert(glGetError() == GL_NO_ERROR);
- glDrawBuffer(GL_BACK);
- glReadBuffer(GL_BACK);
- //glFlush();
-
- weapons.DoStuff();
-
- if(drawtoggle==2)drawtoggle=0;
-
- if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){
- multiplier=tempmult;
- }
- //Jordan fixed your warning!
- return 0;
+ if (i == 0)glColor4f(1, 1, 1, opac);
+ else if (player[i].dead == 2 || player[i].howactive > typesleeping)glColor4f(0, 0, 0, opac * (1 - distcheck / mapviewdist));
+ else if (player[i].dead)glColor4f(.3, .3, .3, opac * (1 - distcheck / mapviewdist));
+ else if (player[i].aitype == attacktypecutoff)glColor4f(1, 0, 0, opac * (1 - distcheck / mapviewdist));
+ else if (player[i].aitype == passivetype)glColor4f(0, 1, 0, opac * (1 - distcheck / mapviewdist));
+ else glColor4f(1, 1, 0, 1);
+ glTranslatef(player[i].coords.x / terrain.scale / 256 * -2 + 1, player[i].coords.z / terrain.scale / 256 * 2 - 1, 0);
+ glRotatef(player[i].yaw + 180, 0, 0, 1);
+ glScalef(.005, .005, .005);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(1, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(1, 1);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, 1);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ }
+ glPopMatrix();
+ glDisable(GL_TEXTURE_2D);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+ }
+
+ if (loading && !stealthloading && (!campaign || player[0].dead)) {
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef(screenwidth, screenheight, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(0, 0, 0, .7);
+ glBegin(GL_QUADS);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f(256, 0, 0.0f);
+ glVertex3f(256, 256, 0.0f);
+ glVertex3f(0, 256, 0.0f);
+ glEnd();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+
+ //logo
+ glDisable(GL_DEPTH_TEST);
+ glColor3f (1.0, 1.0, 1.0); // no coloring
+
+ glEnable(GL_TEXTURE_2D);
+
+ //Minimap
+
+ if (loading != 4) {
+ glEnable(GL_TEXTURE_2D);
+ glColor4f(1, 1, 1, 1);
+ sprintf (string, "Loading...");
+ text->glPrint(1024 / 2 - 90, 768 / 2, string, 1, 2, 1024, 768);
+ }
+ loading = 2;
+ //if(ismotionblur)drawmode=motionblurmode;
+ drawmode = normalmode;
+ }
+
+ if (winfreeze && !campaign) {
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef(screenwidth, screenheight, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(0, 0, 0, .4);
+ glBegin(GL_QUADS);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f(256, 0, 0.0f);
+ glVertex3f(256, 256, 0.0f);
+ glVertex3f(0, 256, 0.0f);
+ glEnd();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+
+ //logo
+ glDisable(GL_DEPTH_TEST);
+ glColor3f (1.0, 1.0, 1.0); // no coloring
+
+ glEnable(GL_TEXTURE_2D);
+
+ //Win Screen Won Victory
+
+ glEnable(GL_TEXTURE_2D);
+ glColor4f(1, 1, 1, 1);
+ sprintf (string, "Level Cleared!");
+ text->glPrintOutlined(1024 / 2 - strlen(string) * 10, 768 * 7 / 8, string, 1, 2, 1024, 768);
+
+ sprintf (string, "Score: %d", (int)(bonustotal - startbonustotal));
+ text->glPrintOutlined(1024 / 30, 768 * 6 / 8, string, 1, 2, 1024, 768);
+
+ if (campaign)
+ sprintf (string, "Press Escape or Space to continue");
+ else
+ sprintf (string, "Press Escape to return to menu or Space to continue");
+ text->glPrintOutlined(640 / 2 - strlen(string) * 5, 480 * 1 / 16, string, 1, 1, 640, 480);
+
+ char temp[255];
+
+ for (i = 0; i < 255; i++)string[i] = '\0';
+ sprintf (temp, "Time: %d:", (int)(((int)leveltime - (int)(leveltime) % 60) / 60));
+ strcat(string, temp);
+ if ((int)(leveltime) % 60 < 10)strcat(string, "0");
+ sprintf (temp, "%d", (int)(leveltime) % 60);
+ strcat(string, temp);
+ text->glPrintOutlined(1024 / 30, 768 * 6 / 8 - 40, string, 1, 2, 1024, 768);
+
+ //Awards
+ int awards[award_count];
+ int numawards = award_awards(awards);
+
+ for (i = 0; i < numawards && i < 6; i++)
+ text->glPrintOutlined(1024 / 30, 768 * 6 / 8 - 90 - 40 * i, award_names[awards[i]], 1, 2, 1024, 768);
+ }
+
+ if (drawmode != normalmode) {
+ glEnable(GL_TEXTURE_2D);
+ glFinish();
+ if (!drawtoggle || drawmode != realmotionblurmode || (drawtoggle == 2 || change == 1)) {
+ if (screentexture) {
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
+ GLfloat subtractColor[4] = { 0.5, 0.5, 0.5, 0.0 };
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, subtractColor);
+ //glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_SUBTRACT);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_CONSTANT_EXT);
+ glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2.0f);
+
+ glBindTexture( GL_TEXTURE_2D, screentexture);
+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texviewwidth, texviewheight);
+ }
+ }
+ if ((drawtoggle || change == 1) && drawmode == realmotionblurmode) {
+ if (screentexture2) {
+ glBindTexture( GL_TEXTURE_2D, screentexture2);
+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texviewwidth, texviewheight);
+ }
+ if (!screentexture2) {
+ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+
+ glGenTextures( 1, &screentexture2 );
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture( GL_TEXTURE_2D, screentexture2);
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kTextureSize, kTextureSize, 0);
+ }
+ }
+ //glFlush();
+ }
+
+ glClear(GL_DEPTH_BUFFER_BIT);
+ Game::ReSizeGLScene(90, .1f);
+ glViewport(0, 0, screenwidth, screenheight);
+
+ if (drawmode != normalmode) {
+ glDisable(GL_DEPTH_TEST);
+ if (drawmode == motionblurmode) {
+ glDrawBuffer(GL_FRONT);
+ glReadBuffer(GL_BACK);
+ }
+ glColor3f (1.0, 1.0, 1.0); // no coloring
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture( GL_TEXTURE_2D, screentexture);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+ glTranslatef(1, 1, 0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ if (drawmode == motionblurmode) {
+ if (motionbluramount < .2)motionbluramount = .2;
+ //glColor4f(1,1,1,fast_sqrt(multiplier)*2.9*motionbluramount);
+ glColor4f(1, 1, 1, motionbluramount);
+ glPushMatrix();
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ if (drawmode == realmotionblurmode) {
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glBindTexture( GL_TEXTURE_2D, screentexture);
+ glColor4f(1, 1, 1, .5);
+ glPushMatrix();
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glBindTexture( GL_TEXTURE_2D, screentexture2);
+ glColor4f(1, 1, 1, .5);
+ glPushMatrix();
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ if (drawmode == doublevisionmode) {
+ static float crosseyedness;
+ crosseyedness = abs(player[0].damage - player[0].superpermanentdamage - (player[0].damagetolerance - player[0].superpermanentdamage) * 1 / 2) / 30;
+ if (crosseyedness > 1)crosseyedness = 1;
+ if (crosseyedness < 0)crosseyedness = 0;
+ glColor4f(1, 1, 1, 1);
+ glDisable(GL_BLEND);
+ glPushMatrix();
+ glScalef(1, 1, 1);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ if (crosseyedness) {
+ glColor4f(1, 1, 1, .5);
+ glEnable(GL_BLEND);
+ glPushMatrix();
+ glTranslatef(.015 * crosseyedness, 0, 0);
+ glScalef(1, 1, 1);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ }
+ if (drawmode == glowmode) {
+ glColor4f(.5, .5, .5, .5);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glPushMatrix();
+ glTranslatef(.01, 0, 0);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(-.01, 0, 0);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(.0, .01, 0);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0, -.01, 0);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ if (drawmode == radialzoommode) {
+ for (i = 0; i < 3; i++) {
+ //glRotatef((float)i*.1,0,0,1);
+ glColor4f(1, 1, 1, 1 / ((float)i + 1));
+ glPushMatrix();
+ glScalef(1 + (float)i * .01, 1 + (float)i * .01, 1);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(texcoordwidth, texcoordheight);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, texcoordheight);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ }
+ glDisable(GL_TEXTURE_2D);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+ }
+
+ if (console) {
+ glEnable(GL_TEXTURE_2D);
+ glColor4f(1, 1, 1, 1);
+ int offset = 0;
+ if (consoleselected >= 60)
+ offset = consoleselected - 60;
+ sprintf (string, " ]");
+ text->glPrint(10, 30, string, 0, 1, 1024, 768);
+ if (consoleblink) {
+ sprintf (string, "_");
+ text->glPrint(30 + (float)(consoleselected) * 10 - offset * 10, 30, string, 0, 1, 1024, 768);
+ }
+ for (i = 0; i < 15; i++)
+ for (j = 0; j < consolechars[i]; j++) {
+ glColor4f(1, 1, 1, 1 - (float)(i) / 16);
+ if (j < consolechars[i]) {
+ sprintf (string, "%c", consoletext[i][j]);
+ text->glPrint(30 + j * 10 - offset * 10, 30 + i * 20, string, 0, 1, 1024, 768);
+ }
+ }
+ }
+ }
+
+ if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted)) {
+ multiplier = tempmult;
+ }
+
+ if (mainmenu) {
+ DrawMenu();
+ }
+
+ if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted)) {
+ tempmult = multiplier;
+ multiplier = 0;
+ }
+
+ //glFlush();
+ if ( side == stereoRight || side == stereoCenter ) {
+ if (drawmode != motionblurmode || mainmenu) {
+ swap_gl_buffers();
+ }
+ }
+
+ //myassert(glGetError() == GL_NO_ERROR);
+ glDrawBuffer(GL_BACK);
+ glReadBuffer(GL_BACK);
+ //glFlush();
+
+ weapons.DoStuff();
+
+ if (drawtoggle == 2)drawtoggle = 0;
+
+ if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted)) {
+ multiplier = tempmult;
+ }
+ //Jordan fixed your warning!
+ return 0;
}
-void DrawMenu() {
- // !!! FIXME: hack: clamp framerate in menu so text input works correctly on fast systems.
- SDL_Delay(15);
+void DrawMenu()
+{
+ // !!! FIXME: hack: clamp framerate in menu so text input works correctly on fast systems.
+ SDL_Delay(15);
- glDrawBuffer(GL_BACK);
- glReadBuffer(GL_BACK);
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
- Game::ReSizeGLScene(90,.1f);
+ glDrawBuffer(GL_BACK);
+ glReadBuffer(GL_BACK);
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+ Game::ReSizeGLScene(90, .1f);
//draw menu background
- glClear(GL_DEPTH_BUFFER_BIT);
- glEnable(GL_ALPHA_TEST);
- glAlphaFunc(GL_GREATER, 0.001f);
- glEnable(GL_TEXTURE_2D);
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glTranslatef(screenwidth/2,screenheight/2,0);
- glPushMatrix();
- glScalef((float)screenwidth/2,(float)screenheight/2,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glDisable(GL_BLEND);
- glColor4f(0,0,0,1.0);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
- glDisable(GL_TEXTURE_2D);
- glBegin(GL_QUADS);
- glVertex3f(-1,-1,0);
- glVertex3f(+1,-1,0);
- glVertex3f(+1,+1,0);
- glVertex3f(-1,+1,0);
- glEnd();
- glEnable(GL_BLEND);
- glColor4f(0.4,0.4,0.4,1.0);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
- glEnable(GL_TEXTURE_2D);
- Game::Mainmenuitems[4].bind();
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1,-1,0);
- glTexCoord2f(1,0);
- glVertex3f(+1,-1,0);
- glTexCoord2f(1,1);
- glVertex3f(+1,+1,0);
- glTexCoord2f(0,1);
- glVertex3f(-1,+1,0);
- glEnd();
- glPopMatrix();
- glPopMatrix();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
-
-
-
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,640,0,480,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glEnable(GL_TEXTURE_2D);
-
+ glClear(GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_ALPHA_TEST);
+ glAlphaFunc(GL_GREATER, 0.001f);
+ glEnable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glTranslatef(screenwidth / 2, screenheight / 2, 0);
+ glPushMatrix();
+ glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDisable(GL_BLEND);
+ glColor4f(0, 0, 0, 1.0);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+ glDisable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ glVertex3f(-1, -1, 0);
+ glVertex3f(+1, -1, 0);
+ glVertex3f(+1, +1, 0);
+ glVertex3f(-1, +1, 0);
+ glEnd();
+ glEnable(GL_BLEND);
+ glColor4f(0.4, 0.4, 0.4, 1.0);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+ glEnable(GL_TEXTURE_2D);
+ Game::Mainmenuitems[4].bind();
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0);
+ glTexCoord2f(1, 0);
+ glVertex3f(+1, -1, 0);
+ glTexCoord2f(1, 1);
+ glVertex3f(+1, +1, 0);
+ glTexCoord2f(0, 1);
+ glVertex3f(-1, +1, 0);
+ glEnd();
+ glPopMatrix();
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+
+
+
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, 640, 0, 480, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glEnable(GL_TEXTURE_2D);
+
Menu::drawItems();
//draw mouse cursor
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix();
-
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glTranslatef(screenwidth/2,screenheight/2,0);
- glPushMatrix();
- glScalef((float)screenwidth/2,(float)screenheight/2,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glEnable(GL_TEXTURE_2D);
- glColor4f(1,1,1,1);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
- glPopMatrix();
- if(!Game::waiting) { // hide the cursor while waiting for a key
- glPushMatrix();
- glTranslatef(Game::mousecoordh-screenwidth/2,Game::mousecoordv*-1+screenheight/2,0);
- glScalef((float)screenwidth/64,(float)screenwidth/64,1);
- glTranslatef(1,-1,0);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glColor4f(1,1,1,1);
- Game::cursortexture.bind();
- glPushMatrix();
- //glScalef(.25,.25,.25);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(1,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(1,1);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,1);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glPopMatrix();
- }
- glPopMatrix();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix();
+
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glTranslatef(screenwidth / 2, screenheight / 2, 0);
+ glPushMatrix();
+ glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glColor4f(1, 1, 1, 1);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+ glPopMatrix();
+ if (!Game::waiting) { // hide the cursor while waiting for a key
+ glPushMatrix();
+ glTranslatef(Game::mousecoordh - screenwidth / 2, Game::mousecoordv * -1 + screenheight / 2, 0);
+ glScalef((float)screenwidth / 64, (float)screenwidth / 64, 1);
+ glTranslatef(1, -1, 0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(1, 1, 1, 1);
+ Game::cursortexture.bind();
+ glPushMatrix();
+ //glScalef(.25,.25,.25);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(1, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(1, 1);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, 1);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glPopMatrix();
+ }
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix();
//draw screen flash
- if(flashamount>0)
- {
- if(flashamount>1)flashamount=1;
- if(flashdelay<=0)flashamount-=multiplier;
+ if (flashamount > 0) {
+ if (flashamount > 1)flashamount = 1;
+ if (flashdelay <= 0)flashamount -= multiplier;
flashdelay--;
- if(flashamount<0)flashamount=0;
+ if (flashamount < 0)flashamount = 0;
glDisable(GL_DEPTH_TEST); // Disables Depth Testing
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glDepthMask(0);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef(screenwidth,screenheight,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glColor4f(flashr,flashg,flashb,flashamount);
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0.0f);
- glVertex3f(256, 0, 0.0f);
- glVertex3f(256, 256, 0.0f);
- glVertex3f(0, 256, 0.0f);
- glEnd();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef(screenwidth, screenheight, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(flashr, flashg, flashb, flashamount);
+ glBegin(GL_QUADS);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f(256, 0, 0.0f);
+ glVertex3f(256, 256, 0.0f);
+ glVertex3f(0, 256, 0.0f);
+ glEnd();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glPopMatrix(); // Restore The Old Projection Matrix
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
#include "Animation.h"
#include "Texture.h"
-extern float screenwidth,screenheight;
+extern float screenwidth, screenheight;
extern float viewdistance;
extern XYZ viewer;
extern XYZ lightlocation;
extern Objects objects;
extern int detail;
extern bool cellophane;
-extern GLubyte bloodText[512*512*3];
-extern GLubyte wolfbloodText[512*512*3];
+extern GLubyte bloodText[512 * 512 * 3];
+extern GLubyte wolfbloodText[512 * 512 * 3];
extern bool ismotionblur;
extern bool trilinear;
extern bool osx;
extern long dirID;
extern int mainmenu;
extern bool visibleloading;
-extern float flashamount,flashr,flashg,flashb;
+extern float flashamount, flashr, flashg, flashb;
extern int flashdelay;
extern int whichjointstartarray[26];
extern int whichjointendarray[26];
extern int difficulty;
-extern float tintr,tintg,tintb;
+extern float tintr, tintg, tintb;
extern float slomospeed;
extern bool gamestarted;
void Dispose()
{
- LOGFUNC;
+ LOGFUNC;
- if(Game::endgame==2){
+ if (Game::endgame == 2) {
Game::accountactive->endGame();
- Game::endgame=0;
- }
+ Game::endgame = 0;
+ }
- Account::saveFile(":Data:Users", Game::accountactive);
+ Account::saveFile(":Data:Users", Game::accountactive);
- //textures.clear();
+ //textures.clear();
- LOG("Shutting down sound system...");
+ LOG("Shutting down sound system...");
- OPENAL_StopSound(OPENAL_ALL);
+ OPENAL_StopSound(OPENAL_ALL);
// this is causing problems on Linux, but we'll force an _exit() a little
// later in the shutdown process. --ryan.
#if !PLATFORM_LINUX
- for (int i=0; i < sounds_count; ++i)
- {
- OPENAL_Sample_Free(samp[i]);
- }
-
- OPENAL_Close();
- if (texture.data)
- {
- free(texture.data);
- }
- texture.data = 0;
+ for (int i = 0; i < sounds_count; ++i) {
+ OPENAL_Sample_Free(samp[i]);
+ }
+
+ OPENAL_Close();
+ if (texture.data) {
+ free(texture.data);
+ }
+ texture.data = 0;
#endif
}
-void Game::newGame(){
+void Game::newGame()
+{
text = new Text();
skybox = new SkyBox();
}
-void Game::deleteGame(){
- if(skybox) delete skybox;
- if(text) delete text;
+void Game::deleteGame()
+{
+ if (skybox) delete skybox;
+ if (text) delete text;
terraintexture.destroy();
terraintexture2.destroy();
cursortexture.destroy();
hawktexture.destroy();
loadscreentexture.destroy();
- for(int i=0;i<10;i++)
+ for (int i = 0; i < 10; i++)
Mainmenuitems[i].destroy();
- glDeleteTextures(1,&screentexture);
- glDeleteTextures(1,&screentexture2);
+ glDeleteTextures(1, &screentexture);
+ glDeleteTextures(1, &screentexture2);
Dispose();
}
-void LoadSave(const char *fileName, GLuint *textureid,bool mipmap,GLubyte *array, int *skinsize)
+void LoadSave(const char *fileName, GLuint *textureid, bool mipmap, GLubyte *array, int *skinsize)
{
- int i;
- int bytesPerPixel;
-
- LOGFUNC;
-
- LOG(std::string("Loading (S)...") + fileName);
-
- //Load Image
- float temptexdetail=texdetail;
- texdetail=1;
- //upload_image( fileName );
- //LoadTGA( fileName );
-
- // Converting file to something os specific
- char * fixedFN = ConvertFileName(fileName);
-
- //Load Image
- unsigned char fileNamep[256];
- CopyCStringToPascal(fixedFN, fileNamep);
- //Load Image
- upload_image( fileNamep ,0);
- texdetail=temptexdetail;
-
- //Is it valid?
- if(1==1){
- bytesPerPixel=texture.bpp/8;
-
- int tempnum=0;
- for(i=0;i<(int)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){
- if((i+1)%4||bytesPerPixel==3){
- array[tempnum]=texture.data[i];
- tempnum++;
- }
- }
- }
+ int i;
+ int bytesPerPixel;
+
+ LOGFUNC;
+
+ LOG(std::string("Loading (S)...") + fileName);
+
+ //Load Image
+ float temptexdetail = texdetail;
+ texdetail = 1;
+ //upload_image( fileName );
+ //LoadTGA( fileName );
+
+ // Converting file to something os specific
+ char * fixedFN = ConvertFileName(fileName);
+
+ //Load Image
+ unsigned char fileNamep[256];
+ CopyCStringToPascal(fixedFN, fileNamep);
+ //Load Image
+ upload_image( fileNamep , 0);
+ texdetail = temptexdetail;
+
+ //Is it valid?
+ if (1 == 1) {
+ bytesPerPixel = texture.bpp / 8;
+
+ int tempnum = 0;
+ for (i = 0; i < (int)(texture.sizeY * texture.sizeX * bytesPerPixel); i++) {
+ if ((i + 1) % 4 || bytesPerPixel == 3) {
+ array[tempnum] = texture.data[i];
+ tempnum++;
+ }
+ }
+ }
}
//***************> ResizeGLScene() <******/
GLvoid Game::ReSizeGLScene(float fov, float pnear)
{
- if (screenheight==0)
- {
- screenheight=1;
- }
+ if (screenheight == 0) {
+ screenheight = 1;
+ }
- glViewport(0,0,screenwidth,screenheight);
+ glViewport(0, 0, screenwidth, screenheight);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
- gluPerspective(fov,(GLfloat)screenwidth/(GLfloat)screenheight,pnear,viewdistance);
+ gluPerspective(fov, (GLfloat)screenwidth / (GLfloat)screenheight, pnear, viewdistance);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
}
void Game::LoadingScreen()
{
- static float loadprogress;
- static AbsoluteTime time = {0,0};
- static AbsoluteTime frametime = {0,0};
- AbsoluteTime currTime = UpTime ();
- double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime);
+ static float loadprogress;
+ static AbsoluteTime time = {0, 0};
+ static AbsoluteTime frametime = {0, 0};
+ AbsoluteTime currTime = UpTime ();
+ double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime);
- if (0 > deltaTime) // if negative microseconds
- deltaTime /= -1000000.0;
- else // else milliseconds
- deltaTime /= 1000.0;
+ if (0 > deltaTime) // if negative microseconds
+ deltaTime /= -1000000.0;
+ else // else milliseconds
+ deltaTime /= 1000.0;
- multiplier=deltaTime;
- if(multiplier<.001)multiplier=.001;
- if(multiplier>10)multiplier=10;
- if(multiplier>.05){
- frametime = currTime; // reset for next time interval
+ multiplier = deltaTime;
+ if (multiplier < .001)multiplier = .001;
+ if (multiplier > 10)multiplier = 10;
+ if (multiplier > .05) {
+ frametime = currTime; // reset for next time interval
- glLoadIdentity();
- //Clear to black
- glClearColor(0,0,0,1);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ //Clear to black
+ glClearColor(0, 0, 0, 1);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- loadtime+=multiplier*4;
+ loadtime += multiplier * 4;
- loadprogress=loadtime;
- if(loadprogress>100)loadprogress=100;
+ loadprogress = loadtime;
+ if (loadprogress > 100)loadprogress = 100;
- //loadprogress=abs(Random()%100);
+ //loadprogress=abs(Random()%100);
- //Background
+ //Background
- glEnable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_2D);
loadscreentexture.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glTranslatef(screenwidth/2,screenheight/2,0);
- glScalef((float)screenwidth/2,(float)screenheight/2,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glDisable(GL_BLEND);
- glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1);
- glPushMatrix();
- //glScalef(.25,.25,.25);
- glBegin(GL_QUADS);
- glTexCoord2f(.1-loadprogress/100,0+loadprogress/100+.3);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(.1-loadprogress/100,0+loadprogress/100+.3);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(.1-loadprogress/100,1+loadprogress/100+.3);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(.1-loadprogress/100,1+loadprogress/100+.3);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glEnable(GL_BLEND);
- glPushMatrix();
- //glScalef(.25,.25,.25);
- glBegin(GL_QUADS);
- glTexCoord2f(.4+loadprogress/100,0+loadprogress/100);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(.4+loadprogress/100,0+loadprogress/100);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(.4+loadprogress/100,1+loadprogress/100);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(.4+loadprogress/100,1+loadprogress/100);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glDisable(GL_TEXTURE_2D);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glDisable(GL_BLEND);
- glDepthMask(1);
-
- glEnable(GL_TEXTURE_2D);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glTranslatef(screenwidth / 2, screenheight / 2, 0);
+ glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDisable(GL_BLEND);
+ glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, 1);
+ glPushMatrix();
+ //glScalef(.25,.25,.25);
+ glBegin(GL_QUADS);
+ glTexCoord2f(.1 - loadprogress / 100, 0 + loadprogress / 100 + .3);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(.1 - loadprogress / 100, 0 + loadprogress / 100 + .3);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(.1 - loadprogress / 100, 1 + loadprogress / 100 + .3);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(.1 - loadprogress / 100, 1 + loadprogress / 100 + .3);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glEnable(GL_BLEND);
+ glPushMatrix();
+ //glScalef(.25,.25,.25);
+ glBegin(GL_QUADS);
+ glTexCoord2f(.4 + loadprogress / 100, 0 + loadprogress / 100);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(.4 + loadprogress / 100, 0 + loadprogress / 100);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(.4 + loadprogress / 100, 1 + loadprogress / 100);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(.4 + loadprogress / 100, 1 + loadprogress / 100);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glDisable(GL_TEXTURE_2D);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+
+ glEnable(GL_TEXTURE_2D);
loadscreentexture.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glTranslatef(screenwidth/2,screenheight/2,0);
- glScalef((float)screenwidth/2*(1.5-(loadprogress)/200),(float)screenheight/2*(1.5-(loadprogress)/200),1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glEnable(GL_BLEND);
- //glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1);
- glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1);
- glPushMatrix();
- //glScalef(.25,.25,.25);
- glBegin(GL_QUADS);
- glTexCoord2f(0+.5,0+.5);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(1+.5,0+.5);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(1+.5,1+.5);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0+.5,1+.5);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glDisable(GL_TEXTURE_2D);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glDisable(GL_BLEND);
- glDepthMask(1);
-
- glEnable(GL_TEXTURE_2D);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glTranslatef(screenwidth / 2, screenheight / 2, 0);
+ glScalef((float)screenwidth / 2 * (1.5 - (loadprogress) / 200), (float)screenheight / 2 * (1.5 - (loadprogress) / 200), 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glEnable(GL_BLEND);
+ //glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1);
+ glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, 1);
+ glPushMatrix();
+ //glScalef(.25,.25,.25);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0 + .5, 0 + .5);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(1 + .5, 0 + .5);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(1 + .5, 1 + .5);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0 + .5, 1 + .5);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glDisable(GL_TEXTURE_2D);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+
+ glEnable(GL_TEXTURE_2D);
loadscreentexture.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glTranslatef(screenwidth/2,screenheight/2,0);
- glScalef((float)screenwidth/2*(100+loadprogress)/100,(float)screenheight/2*(100+loadprogress)/100,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glEnable(GL_BLEND);
- glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,.4);
- glPushMatrix();
- //glScalef(.25,.25,.25);
- glBegin(GL_QUADS);
- glTexCoord2f(0+.2,0+.8);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(1+.2,0+.8);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(1+.2,1+.8);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0+.2,1+.8);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glDisable(GL_TEXTURE_2D);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glDisable(GL_BLEND);
- glDepthMask(1);
-
- //Text
-
- if(flashamount>0){
- if(flashamount>1)flashamount=1;
- if(flashdelay<=0)flashamount-=multiplier;
- flashdelay--;
- if(flashamount<0)flashamount=0;
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glScalef(screenwidth,screenheight,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- glColor4f(flashr,flashg,flashb,flashamount);
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0.0f);
- glVertex3f(256, 0, 0.0f);
- glVertex3f(256, 256, 0.0f);
- glVertex3f(0, 256, 0.0f);
- glEnd();
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glEnable(GL_CULL_FACE);
- glDisable(GL_BLEND);
- glDepthMask(1);
- }
-
- swap_gl_buffers();
- }
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glTranslatef(screenwidth / 2, screenheight / 2, 0);
+ glScalef((float)screenwidth / 2 * (100 + loadprogress) / 100, (float)screenheight / 2 * (100 + loadprogress) / 100, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glEnable(GL_BLEND);
+ glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, .4);
+ glPushMatrix();
+ //glScalef(.25,.25,.25);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0 + .2, 0 + .8);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(1 + .2, 0 + .8);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(1 + .2, 1 + .8);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0 + .2, 1 + .8);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glDisable(GL_TEXTURE_2D);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+
+ //Text
+
+ if (flashamount > 0) {
+ if (flashamount > 1)flashamount = 1;
+ if (flashdelay <= 0)flashamount -= multiplier;
+ flashdelay--;
+ if (flashamount < 0)flashamount = 0;
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glScalef(screenwidth, screenheight, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(flashr, flashg, flashb, flashamount);
+ glBegin(GL_QUADS);
+ glVertex3f(0, 0, 0.0f);
+ glVertex3f(256, 0, 0.0f);
+ glVertex3f(256, 256, 0.0f);
+ glVertex3f(0, 256, 0.0f);
+ glEnd();
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+ }
+
+ swap_gl_buffers();
+ }
}
void FadeLoadingScreen(float howmuch)
{
- static float loadprogress;
-
- glLoadIdentity();
- //Clear to black
- glClearColor(0,0,0,1);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- loadprogress=howmuch;
-
- //loadprogress=abs(Random()%100);
-
- //Background
-
- //glEnable(GL_TEXTURE_2D);
- glDisable(GL_TEXTURE_2D);
- //glBindTexture( GL_TEXTURE_2D, loadscreentexture);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDepthMask(0);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity(); // Reset The Modelview Matrix
- glTranslatef(screenwidth/2,screenheight/2,0);
- glScalef((float)screenwidth/2,(float)screenheight/2,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glDisable(GL_BLEND);
- glColor4f(loadprogress/100,0,0,1);
- glPushMatrix();
- //glScalef(.25,.25,.25);
- glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(-1, -1, 0.0f);
- glTexCoord2f(1,0);
- glVertex3f(1, -1, 0.0f);
- glTexCoord2f(1,1);
- glVertex3f(1, 1, 0.0f);
- glTexCoord2f(0,1);
- glVertex3f(-1, 1, 0.0f);
- glEnd();
- glPopMatrix();
- glDisable(GL_TEXTURE_2D);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glDisable(GL_BLEND);
- glDepthMask(1);
- //Text
- swap_gl_buffers();
+ static float loadprogress;
+
+ glLoadIdentity();
+ //Clear to black
+ glClearColor(0, 0, 0, 1);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ loadprogress = howmuch;
+
+ //loadprogress=abs(Random()%100);
+
+ //Background
+
+ //glEnable(GL_TEXTURE_2D);
+ glDisable(GL_TEXTURE_2D);
+ //glBindTexture( GL_TEXTURE_2D, loadscreentexture);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDepthMask(0);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, screenwidth, 0, screenheight, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity(); // Reset The Modelview Matrix
+ glTranslatef(screenwidth / 2, screenheight / 2, 0);
+ glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDisable(GL_BLEND);
+ glColor4f(loadprogress / 100, 0, 0, 1);
+ glPushMatrix();
+ //glScalef(.25,.25,.25);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex3f(-1, -1, 0.0f);
+ glTexCoord2f(1, 0);
+ glVertex3f(1, -1, 0.0f);
+ glTexCoord2f(1, 1);
+ glVertex3f(1, 1, 0.0f);
+ glTexCoord2f(0, 1);
+ glVertex3f(-1, 1, 0.0f);
+ glEnd();
+ glPopMatrix();
+ glDisable(GL_TEXTURE_2D);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glDisable(GL_BLEND);
+ glDepthMask(1);
+ //Text
+ swap_gl_buffers();
}
extern bool cmdline(const char *cmd);
-
+
void Game::InitGame()
{
#if PLATFORM_MACOSX
- ProcessSerialNumber PSN;
- ProcessInfoRec pinfo;
- FSSpec pspec;
- OSStatus err;
- /* set up process serial number */
- PSN.highLongOfPSN = 0;
- PSN.lowLongOfPSN = kCurrentProcess;
- /* set up info block */
- pinfo.processInfoLength = sizeof(pinfo);
- pinfo.processName = NULL;
- pinfo.processAppSpec = &pspec;
- /* grab the vrefnum and directory */
- err = GetProcessInformation(&PSN, &pinfo);
- if (err == noErr) {
- vRefNum = pspec.vRefNum;
- dirID = pspec.parID;
- }
+ ProcessSerialNumber PSN;
+ ProcessInfoRec pinfo;
+ FSSpec pspec;
+ OSStatus err;
+ /* set up process serial number */
+ PSN.highLongOfPSN = 0;
+ PSN.lowLongOfPSN = kCurrentProcess;
+ /* set up info block */
+ pinfo.processInfoLength = sizeof(pinfo);
+ pinfo.processName = NULL;
+ pinfo.processAppSpec = &pspec;
+ /* grab the vrefnum and directory */
+ err = GetProcessInformation(&PSN, &pinfo);
+ if (err == noErr) {
+ vRefNum = pspec.vRefNum;
+ dirID = pspec.parID;
+ }
#endif
- LOGFUNC;
+ LOGFUNC;
- numchallengelevels=14;
+ numchallengelevels = 14;
- accountactive=Account::loadFile(":Data:Users");
+ accountactive = Account::loadFile(":Data:Users");
- tintr=1;
- tintg=1;
- tintb=1;
+ tintr = 1;
+ tintg = 1;
+ tintb = 1;
- whichjointstartarray[0]=righthip;
- whichjointendarray[0]=rightfoot;
+ whichjointstartarray[0] = righthip;
+ whichjointendarray[0] = rightfoot;
- whichjointstartarray[1]=righthip;
- whichjointendarray[1]=rightankle;
+ whichjointstartarray[1] = righthip;
+ whichjointendarray[1] = rightankle;
- whichjointstartarray[2]=righthip;
- whichjointendarray[2]=rightknee;
+ whichjointstartarray[2] = righthip;
+ whichjointendarray[2] = rightknee;
- whichjointstartarray[3]=rightknee;
- whichjointendarray[3]=rightankle;
+ whichjointstartarray[3] = rightknee;
+ whichjointendarray[3] = rightankle;
- whichjointstartarray[4]=rightankle;
- whichjointendarray[4]=rightfoot;
+ whichjointstartarray[4] = rightankle;
+ whichjointendarray[4] = rightfoot;
- whichjointstartarray[5]=lefthip;
- whichjointendarray[5]=leftfoot;
+ whichjointstartarray[5] = lefthip;
+ whichjointendarray[5] = leftfoot;
- whichjointstartarray[6]=lefthip;
- whichjointendarray[6]=leftankle;
+ whichjointstartarray[6] = lefthip;
+ whichjointendarray[6] = leftankle;
- whichjointstartarray[7]=lefthip;
- whichjointendarray[7]=leftknee;
+ whichjointstartarray[7] = lefthip;
+ whichjointendarray[7] = leftknee;
- whichjointstartarray[8]=leftknee;
- whichjointendarray[8]=leftankle;
+ whichjointstartarray[8] = leftknee;
+ whichjointendarray[8] = leftankle;
- whichjointstartarray[9]=leftankle;
- whichjointendarray[9]=leftfoot;
+ whichjointstartarray[9] = leftankle;
+ whichjointendarray[9] = leftfoot;
- whichjointstartarray[10]=abdomen;
- whichjointendarray[10]=rightshoulder;
+ whichjointstartarray[10] = abdomen;
+ whichjointendarray[10] = rightshoulder;
- whichjointstartarray[11]=abdomen;
- whichjointendarray[11]=rightelbow;
+ whichjointstartarray[11] = abdomen;
+ whichjointendarray[11] = rightelbow;
- whichjointstartarray[12]=abdomen;
- whichjointendarray[12]=rightwrist;
+ whichjointstartarray[12] = abdomen;
+ whichjointendarray[12] = rightwrist;
- whichjointstartarray[13]=abdomen;
- whichjointendarray[13]=righthand;
+ whichjointstartarray[13] = abdomen;
+ whichjointendarray[13] = righthand;
- whichjointstartarray[14]=rightshoulder;
- whichjointendarray[14]=rightelbow;
+ whichjointstartarray[14] = rightshoulder;
+ whichjointendarray[14] = rightelbow;
- whichjointstartarray[15]=rightelbow;
- whichjointendarray[15]=rightwrist;
+ whichjointstartarray[15] = rightelbow;
+ whichjointendarray[15] = rightwrist;
- whichjointstartarray[16]=rightwrist;
- whichjointendarray[16]=righthand;
+ whichjointstartarray[16] = rightwrist;
+ whichjointendarray[16] = righthand;
- whichjointstartarray[17]=abdomen;
- whichjointendarray[17]=leftshoulder;
+ whichjointstartarray[17] = abdomen;
+ whichjointendarray[17] = leftshoulder;
- whichjointstartarray[18]=abdomen;
- whichjointendarray[18]=leftelbow;
+ whichjointstartarray[18] = abdomen;
+ whichjointendarray[18] = leftelbow;
- whichjointstartarray[19]=abdomen;
- whichjointendarray[19]=leftwrist;
+ whichjointstartarray[19] = abdomen;
+ whichjointendarray[19] = leftwrist;
- whichjointstartarray[20]=abdomen;
- whichjointendarray[20]=lefthand;
+ whichjointstartarray[20] = abdomen;
+ whichjointendarray[20] = lefthand;
- whichjointstartarray[21]=leftshoulder;
- whichjointendarray[21]=leftelbow;
+ whichjointstartarray[21] = leftshoulder;
+ whichjointendarray[21] = leftelbow;
- whichjointstartarray[22]=leftelbow;
- whichjointendarray[22]=leftwrist;
+ whichjointstartarray[22] = leftelbow;
+ whichjointendarray[22] = leftwrist;
- whichjointstartarray[23]=leftwrist;
- whichjointendarray[23]=lefthand;
+ whichjointstartarray[23] = leftwrist;
+ whichjointendarray[23] = lefthand;
- whichjointstartarray[24]=abdomen;
- whichjointendarray[24]=neck;
+ whichjointstartarray[24] = abdomen;
+ whichjointendarray[24] = neck;
- whichjointstartarray[25]=neck;
- whichjointendarray[25]=head;
+ whichjointstartarray[25] = neck;
+ whichjointendarray[25] = head;
- FadeLoadingScreen(0);
+ FadeLoadingScreen(0);
- stillloading=1;
+ stillloading = 1;
- texture.data = ( GLubyte* )malloc( 1024*1024*4 );
+ texture.data = ( GLubyte* )malloc( 1024 * 1024 * 4 );
- int temptexdetail=texdetail;
- texdetail=1;
- text->LoadFontTexture(":Data:Textures:Font.png");
- text->BuildFont();
- texdetail=temptexdetail;
+ int temptexdetail = texdetail;
+ texdetail = 1;
+ text->LoadFontTexture(":Data:Textures:Font.png");
+ text->BuildFont();
+ texdetail = temptexdetail;
- FadeLoadingScreen(10);
+ FadeLoadingScreen(10);
- if(detail==2){
- texdetail=1;
- }
- if(detail==1){
- texdetail=2;
- }
- if(detail==0){
- texdetail=4;
- }
+ if (detail == 2) {
+ texdetail = 1;
+ }
+ if (detail == 1) {
+ texdetail = 2;
+ }
+ if (detail == 0) {
+ texdetail = 4;
+ }
- LOG("Initializing sound system...");
+ LOG("Initializing sound system...");
- #if PLATFORM_LINUX
+#if PLATFORM_LINUX
int output = -1;
-
+
unsigned char rc = 0;
output = OPENAL_OUTPUT_ALSA; // Try alsa first...
if (cmdline("forceoss")) // ...but let user override that.
output = OPENAL_OUTPUT_NOSOUND;
OPENAL_SetOutput(output);
- if ((rc = OPENAL_Init(44100, 32, 0)) == false)
- {
+ if ((rc = OPENAL_Init(44100, 32, 0)) == false) {
// if we tried ALSA and failed, fall back to OSS.
- if ( (output == OPENAL_OUTPUT_ALSA) && (!cmdline("forcealsa")) )
- {
+ if ( (output == OPENAL_OUTPUT_ALSA) && (!cmdline("forcealsa")) ) {
OPENAL_Close();
output = OPENAL_OUTPUT_OSS;
OPENAL_SetOutput(output);
- rc = OPENAL_Init(44100, 32, 0);
+ rc = OPENAL_Init(44100, 32, 0);
}
}
- if (rc == false)
- {
+ if (rc == false) {
OPENAL_Close();
output = OPENAL_OUTPUT_NOSOUND; // we tried! just do silence.
OPENAL_SetOutput(output);
- rc = OPENAL_Init(44100, 32, 0);
+ rc = OPENAL_Init(44100, 32, 0);
}
- #else
- OPENAL_Init(44100, 32, 0);
- #endif
+#else
+ OPENAL_Init(44100, 32, 0);
+#endif
+
+ OPENAL_SetSFXMasterVolume((int)(volume * 255));
+ loadAllSounds();
- OPENAL_SetSFXMasterVolume((int)(volume*255));
- loadAllSounds();
+ if (musictoggle)
+ emit_stream_np(stream_menutheme);
- if(musictoggle)
- emit_stream_np(stream_menutheme);
+ cursortexture.load(":Data:Textures:Cursor.png", 0, 1);
- cursortexture.load(":Data:Textures:Cursor.png",0,1);
+ Mapcircletexture.load(":Data:Textures:MapCircle.png", 0, 1);
+ Mapboxtexture.load(":Data:Textures:MapBox.png", 0, 1);
+ Maparrowtexture.load(":Data:Textures:MapArrow.png", 0, 1);
- Mapcircletexture.load(":Data:Textures:MapCircle.png",0,1);
- Mapboxtexture.load(":Data:Textures:MapBox.png",0,1);
- Maparrowtexture.load(":Data:Textures:MapArrow.png",0,1);
+ temptexdetail = texdetail;
+ if (texdetail > 2)texdetail = 2;
+ Mainmenuitems[0].load(":Data:Textures:Lugaru.png", 0, 0);
+ Mainmenuitems[1].load(":Data:Textures:Newgame.png", 0, 0);
+ Mainmenuitems[2].load(":Data:Textures:Options.png", 0, 0);
+ Mainmenuitems[3].load(":Data:Textures:Quit.png", 0, 0);
+ Mainmenuitems[4].load(":Data:Textures:Eyelid.png", 0, 1);
+ Mainmenuitems[5].load(":Data:Textures:Resume.png", 0, 0);
+ Mainmenuitems[6].load(":Data:Textures:Endgame.png", 0, 0);
- temptexdetail=texdetail;
- if(texdetail>2)texdetail=2;
- Mainmenuitems[0].load(":Data:Textures:Lugaru.png",0,0);
- Mainmenuitems[1].load(":Data:Textures:Newgame.png",0,0);
- Mainmenuitems[2].load(":Data:Textures:Options.png",0,0);
- Mainmenuitems[3].load(":Data:Textures:Quit.png",0,0);
- Mainmenuitems[4].load(":Data:Textures:Eyelid.png",0,1);
- Mainmenuitems[5].load(":Data:Textures:Resume.png",0,0);
- Mainmenuitems[6].load(":Data:Textures:Endgame.png",0,0);
-
- //LoadTexture(":Data:Textures:Eye.jpg",&Mainmenuitems[5],0,1);
- //~ LoadTexture(":Data:Textures:World.png",&Mainmenuitems[7],0,0); // LoadCampaign will take care of that
- texdetail=temptexdetail;
+ //LoadTexture(":Data:Textures:Eye.jpg",&Mainmenuitems[5],0,1);
+ //~ LoadTexture(":Data:Textures:World.png",&Mainmenuitems[7],0,0); // LoadCampaign will take care of that
+ texdetail = temptexdetail;
- FadeLoadingScreen(95);
+ FadeLoadingScreen(95);
- gameon=0;
- mainmenu=1;
+ gameon = 0;
+ mainmenu = 1;
- stillloading=0;
- firstload=0;
+ stillloading = 0;
+ firstload = 0;
- newdetail=detail;
- newscreenwidth=screenwidth;
- newscreenheight=screenheight;
+ newdetail = detail;
+ newscreenwidth = screenwidth;
+ newscreenheight = screenheight;
LoadMenu();
}
-void Game::LoadScreenTexture() {
+void Game::LoadScreenTexture()
+{
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
- if(!Game::screentexture)
+ if (!Game::screentexture)
glGenTextures( 1, &Game::screentexture );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
//TODO: move LoadStuff() closer to GameTick.cpp to get rid of various vars shared in Game.h
void Game::LoadStuff()
{
- static float temptexdetail;
- static float viewdistdetail;
- static int i,j;
- float megascale =1;
-
- LOGFUNC;
-
- loadtime=0;
-
- stillloading=1;
-
- for(i=0;i<maxplayers;i++)
- player[i].skeleton.drawmodel.textureptr.destroy();
-
- i=abs(Random()%4);
- visibleloading=0; //don't use loadscreentexture yet
- loadscreentexture.load(":Data:Textures:fire.jpg",1,0);
- visibleloading=1;
-
- temptexdetail=texdetail;
- texdetail=1;
- text->LoadFontTexture(":Data:Textures:Font.png");
- text->BuildFont();
- texdetail=temptexdetail;
-
- numsounds=71;
-
- viewdistdetail=2;
- viewdistance=50*megascale*viewdistdetail;
-
- if(detail==2){
- texdetail=1;
- }
- if(detail==1){
- texdetail=2;
- }
- if(detail==0){
- texdetail=4;
- }
-
- realtexdetail=texdetail;
-
- numplayers=1;
-
-
- LOG("Loading weapon data...");
-
- Weapon::knifetextureptr.load(":Data:Textures:knife.png",0,1);
- Weapon::bloodknifetextureptr.load(":Data:Textures:bloodknife.png",0,1);
- Weapon::lightbloodknifetextureptr.load(":Data:Textures:lightbloodknife.png",0,1);
- Weapon::swordtextureptr.load(":Data:Textures:sword.jpg",1,0);
- Weapon::bloodswordtextureptr.load(":Data:Textures:Swordblood.jpg",1,0);
- Weapon::lightbloodswordtextureptr.load(":Data:Textures:Swordbloodlight.jpg",1,0);
- Weapon::stafftextureptr.load(":Data:Textures:Staff.jpg",1,0);
-
- Weapon::throwingknifemodel.load((char *)":Data:Models:throwingknife.solid",1);
- Weapon::throwingknifemodel.Scale(.001,.001,.001);
- //Weapon::throwingknifemodel.Rotate(0,0,-90);
- Weapon::throwingknifemodel.Rotate(90,0,0);
- Weapon::throwingknifemodel.Rotate(0,90,0);
- Weapon::throwingknifemodel.flat=0;
- Weapon::throwingknifemodel.CalculateNormals(1);
- //Weapon::throwingknifemodel.ScaleNormals(-1,-1,-1);
-
- Weapon::swordmodel.load((char *)":Data:Models:sword.solid",1);
- Weapon::swordmodel.Scale(.001,.001,.001);
- //Weapon::swordmodel.Rotate(0,0,-90);
- Weapon::swordmodel.Rotate(90,0,0);
- Weapon::swordmodel.Rotate(0,90,0);
- Weapon::swordmodel.Rotate(0,0,90);
- Weapon::swordmodel.flat=1;
- Weapon::swordmodel.CalculateNormals(1);
- //Weapon::swordmodel.ScaleNormals(-1,-1,-1);
-
- Weapon::staffmodel.load((char *)":Data:Models:staff.solid",1);
- Weapon::staffmodel.Scale(.005,.005,.005);
- //Weapon::staffmodel.Rotate(0,0,-90);
- Weapon::staffmodel.Rotate(90,0,0);
- Weapon::staffmodel.Rotate(0,90,0);
- Weapon::staffmodel.Rotate(0,0,90);
- Weapon::staffmodel.flat=1;
- Weapon::staffmodel.CalculateNormals(1);
- //Weapon::staffmodel.ScaleNormals(-1,-1,-1);
-
- terrain.shadowtexture.load(":Data:Textures:shadow.png",0,1);
- terrain.bloodtexture.load(":Data:Textures:blood.png",0,1);
- terrain.breaktexture.load(":Data:Textures:break.png",0,1);
- terrain.bloodtexture2.load(":Data:Textures:blood.png",0,1);
-
-
- terrain.footprinttexture.load(":Data:Textures:footprint.png",0,1);
- terrain.bodyprinttexture.load(":Data:Textures:bodyprint.png",0,1);
- hawktexture.load(":Data:Textures:hawk.png",0,1);
-
-
- Sprite::cloudtexture.load(":Data:Textures:cloud.png",1,1);
- Sprite::cloudimpacttexture.load(":Data:Textures:cloudimpact.png",1,1);
- Sprite::bloodtexture.load(":Data:Textures:bloodparticle.png",1,1);
- Sprite::snowflaketexture.load(":Data:Textures:snowflake.png",1,1);
- Sprite::flametexture.load(":Data:Textures:flame.png",1,1);
- Sprite::bloodflametexture.load(":Data:Textures:bloodflame.png",1,1);
- Sprite::smoketexture.load(":Data:Textures:smoke.png",1,1);
- Sprite::shinetexture.load(":Data:Textures:shine.png",1,0);
- Sprite::splintertexture.load(":Data:Textures:splinter.png",1,1);
- Sprite::leaftexture.load(":Data:Textures:leaf.png",1,1);
- Sprite::toothtexture.load(":Data:Textures:tooth.png",1,1);
-
- yaw=0;
- pitch=0;
- ReSizeGLScene(90,.01);
-
- viewer=0;
-
-
- if(detail)kTextureSize=1024;
- if(detail==1)kTextureSize=512;
- if(detail==0)kTextureSize=256;
-
- //Set up distant light
- light.color[0]=.95;
- light.color[1]=.95;
- light.color[2]=1;
- light.ambient[0]=.2;
- light.ambient[1]=.2;
- light.ambient[2]=.24;
- light.location.x=1;
- light.location.y=1;
- light.location.z=-.2;
- Normalise(&light.location);
-
- LoadingScreen();
-
- SetUpLighting();
-
-
- fadestart=.6;
- gravity=-10;
-
- texscale=.2/megascale/viewdistdetail;
- terrain.scale=3*megascale*viewdistdetail;
-
- viewer.x=terrain.size/2*terrain.scale;
- viewer.z=terrain.size/2*terrain.scale;
-
- hawk.load((char *)":Data:Models:hawk.solid",1);
- hawk.Scale(.03,.03,.03);
- hawk.Rotate(90,1,1);
- hawk.CalculateNormals(0);
- hawk.ScaleNormals(-1,-1,-1);
- hawkcoords.x=terrain.size/2*terrain.scale-5-7;
- hawkcoords.z=terrain.size/2*terrain.scale-5-7;
- hawkcoords.y=terrain.getHeight(hawkcoords.x,hawkcoords.z)+25;
-
- eye.load((char *)":Data:Models:eye.solid",1);
- eye.Scale(.03,.03,.03);
- eye.CalculateNormals(0);
-
- cornea.load((char *)":Data:Models:cornea.solid",1);
- cornea.Scale(.03,.03,.03);
- cornea.CalculateNormals(0);
-
- iris.load((char *)":Data:Models:iris.solid",1);
- iris.Scale(.03,.03,.03);
- iris.CalculateNormals(0);
-
- LoadSave(":Data:Textures:Bloodfur.png",0,1,&bloodText[0],0);
- LoadSave(":Data:Textures:Wolfbloodfur.png",0,1,&wolfbloodText[0],0);
-
- oldenvironment=-4;
-
- gameon=1;
- mainmenu=0;
-
- firstload=0;
-
- loadAllAnimations();
- //Fix knife stab, too lazy to do it manually
- XYZ moveamount;
- moveamount=0;
- moveamount.z=2;
- for(i=0;i<player[0].skeleton.num_joints;i++){
- for(j=0;j<animation[knifesneakattackanim].numframes;j++){
- animation[knifesneakattackanim].position[i][j]+=moveamount;
- }
- }
-
- LoadingScreen();
-
- for(i=0;i<player[0].skeleton.num_joints;i++){
- for(j=0;j<animation[knifesneakattackedanim].numframes;j++){
- animation[knifesneakattackedanim].position[i][j]+=moveamount;
- }
- }
-
- LoadingScreen();
-
- for(i=0;i<player[0].skeleton.num_joints;i++){
- animation[dead1anim].position[i][1]=animation[dead1anim].position[i][0];
- animation[dead2anim].position[i][1]=animation[dead2anim].position[i][0];
- animation[dead3anim].position[i][1]=animation[dead3anim].position[i][0];
- animation[dead4anim].position[i][1]=animation[dead4anim].position[i][0];
- }
- animation[dead1anim].speed[0]=0.001;
- animation[dead2anim].speed[0]=0.001;
- animation[dead3anim].speed[0]=0.001;
- animation[dead4anim].speed[0]=0.001;
-
- animation[dead1anim].speed[1]=0.001;
- animation[dead2anim].speed[1]=0.001;
- animation[dead3anim].speed[1]=0.001;
- animation[dead4anim].speed[1]=0.001;
-
- for(i=0;i<player[0].skeleton.num_joints;i++){
- for(j=0;j<animation[swordsneakattackanim].numframes;j++){
- animation[swordsneakattackanim].position[i][j]+=moveamount;
- }
- }
- LoadingScreen();
- for(j=0;j<animation[swordsneakattackanim].numframes;j++){
- animation[swordsneakattackanim].weapontarget[j]+=moveamount;
- }
-
- LoadingScreen();
-
- for(i=0;i<player[0].skeleton.num_joints;i++){
- for(j=0;j<animation[swordsneakattackedanim].numframes;j++){
- animation[swordsneakattackedanim].position[i][j]+=moveamount;
- }
- }
-
- LoadingScreen();
- temptexdetail=texdetail;
- texdetail=1;
- texdetail=temptexdetail;
-
- LoadingScreen();
-
- if(!screentexture){
+ static float temptexdetail;
+ static float viewdistdetail;
+ static int i, j;
+ float megascale = 1;
+
+ LOGFUNC;
+
+ loadtime = 0;
+
+ stillloading = 1;
+
+ for (i = 0; i < maxplayers; i++)
+ player[i].skeleton.drawmodel.textureptr.destroy();
+
+ i = abs(Random() % 4);
+ visibleloading = 0; //don't use loadscreentexture yet
+ loadscreentexture.load(":Data:Textures:fire.jpg", 1, 0);
+ visibleloading = 1;
+
+ temptexdetail = texdetail;
+ texdetail = 1;
+ text->LoadFontTexture(":Data:Textures:Font.png");
+ text->BuildFont();
+ texdetail = temptexdetail;
+
+ numsounds = 71;
+
+ viewdistdetail = 2;
+ viewdistance = 50 * megascale * viewdistdetail;
+
+ if (detail == 2) {
+ texdetail = 1;
+ }
+ if (detail == 1) {
+ texdetail = 2;
+ }
+ if (detail == 0) {
+ texdetail = 4;
+ }
+
+ realtexdetail = texdetail;
+
+ numplayers = 1;
+
+
+ LOG("Loading weapon data...");
+
+ Weapon::knifetextureptr.load(":Data:Textures:knife.png", 0, 1);
+ Weapon::bloodknifetextureptr.load(":Data:Textures:bloodknife.png", 0, 1);
+ Weapon::lightbloodknifetextureptr.load(":Data:Textures:lightbloodknife.png", 0, 1);
+ Weapon::swordtextureptr.load(":Data:Textures:sword.jpg", 1, 0);
+ Weapon::bloodswordtextureptr.load(":Data:Textures:Swordblood.jpg", 1, 0);
+ Weapon::lightbloodswordtextureptr.load(":Data:Textures:Swordbloodlight.jpg", 1, 0);
+ Weapon::stafftextureptr.load(":Data:Textures:Staff.jpg", 1, 0);
+
+ Weapon::throwingknifemodel.load((char *)":Data:Models:throwingknife.solid", 1);
+ Weapon::throwingknifemodel.Scale(.001, .001, .001);
+ //Weapon::throwingknifemodel.Rotate(0,0,-90);
+ Weapon::throwingknifemodel.Rotate(90, 0, 0);
+ Weapon::throwingknifemodel.Rotate(0, 90, 0);
+ Weapon::throwingknifemodel.flat = 0;
+ Weapon::throwingknifemodel.CalculateNormals(1);
+ //Weapon::throwingknifemodel.ScaleNormals(-1,-1,-1);
+
+ Weapon::swordmodel.load((char *)":Data:Models:sword.solid", 1);
+ Weapon::swordmodel.Scale(.001, .001, .001);
+ //Weapon::swordmodel.Rotate(0,0,-90);
+ Weapon::swordmodel.Rotate(90, 0, 0);
+ Weapon::swordmodel.Rotate(0, 90, 0);
+ Weapon::swordmodel.Rotate(0, 0, 90);
+ Weapon::swordmodel.flat = 1;
+ Weapon::swordmodel.CalculateNormals(1);
+ //Weapon::swordmodel.ScaleNormals(-1,-1,-1);
+
+ Weapon::staffmodel.load((char *)":Data:Models:staff.solid", 1);
+ Weapon::staffmodel.Scale(.005, .005, .005);
+ //Weapon::staffmodel.Rotate(0,0,-90);
+ Weapon::staffmodel.Rotate(90, 0, 0);
+ Weapon::staffmodel.Rotate(0, 90, 0);
+ Weapon::staffmodel.Rotate(0, 0, 90);
+ Weapon::staffmodel.flat = 1;
+ Weapon::staffmodel.CalculateNormals(1);
+ //Weapon::staffmodel.ScaleNormals(-1,-1,-1);
+
+ terrain.shadowtexture.load(":Data:Textures:shadow.png", 0, 1);
+ terrain.bloodtexture.load(":Data:Textures:blood.png", 0, 1);
+ terrain.breaktexture.load(":Data:Textures:break.png", 0, 1);
+ terrain.bloodtexture2.load(":Data:Textures:blood.png", 0, 1);
+
+
+ terrain.footprinttexture.load(":Data:Textures:footprint.png", 0, 1);
+ terrain.bodyprinttexture.load(":Data:Textures:bodyprint.png", 0, 1);
+ hawktexture.load(":Data:Textures:hawk.png", 0, 1);
+
+
+ Sprite::cloudtexture.load(":Data:Textures:cloud.png", 1, 1);
+ Sprite::cloudimpacttexture.load(":Data:Textures:cloudimpact.png", 1, 1);
+ Sprite::bloodtexture.load(":Data:Textures:bloodparticle.png", 1, 1);
+ Sprite::snowflaketexture.load(":Data:Textures:snowflake.png", 1, 1);
+ Sprite::flametexture.load(":Data:Textures:flame.png", 1, 1);
+ Sprite::bloodflametexture.load(":Data:Textures:bloodflame.png", 1, 1);
+ Sprite::smoketexture.load(":Data:Textures:smoke.png", 1, 1);
+ Sprite::shinetexture.load(":Data:Textures:shine.png", 1, 0);
+ Sprite::splintertexture.load(":Data:Textures:splinter.png", 1, 1);
+ Sprite::leaftexture.load(":Data:Textures:leaf.png", 1, 1);
+ Sprite::toothtexture.load(":Data:Textures:tooth.png", 1, 1);
+
+ yaw = 0;
+ pitch = 0;
+ ReSizeGLScene(90, .01);
+
+ viewer = 0;
+
+
+ if (detail)kTextureSize = 1024;
+ if (detail == 1)kTextureSize = 512;
+ if (detail == 0)kTextureSize = 256;
+
+ //Set up distant light
+ light.color[0] = .95;
+ light.color[1] = .95;
+ light.color[2] = 1;
+ light.ambient[0] = .2;
+ light.ambient[1] = .2;
+ light.ambient[2] = .24;
+ light.location.x = 1;
+ light.location.y = 1;
+ light.location.z = -.2;
+ Normalise(&light.location);
+
+ LoadingScreen();
+
+ SetUpLighting();
+
+
+ fadestart = .6;
+ gravity = -10;
+
+ texscale = .2 / megascale / viewdistdetail;
+ terrain.scale = 3 * megascale * viewdistdetail;
+
+ viewer.x = terrain.size / 2 * terrain.scale;
+ viewer.z = terrain.size / 2 * terrain.scale;
+
+ hawk.load((char *)":Data:Models:hawk.solid", 1);
+ hawk.Scale(.03, .03, .03);
+ hawk.Rotate(90, 1, 1);
+ hawk.CalculateNormals(0);
+ hawk.ScaleNormals(-1, -1, -1);
+ hawkcoords.x = terrain.size / 2 * terrain.scale - 5 - 7;
+ hawkcoords.z = terrain.size / 2 * terrain.scale - 5 - 7;
+ hawkcoords.y = terrain.getHeight(hawkcoords.x, hawkcoords.z) + 25;
+
+ eye.load((char *)":Data:Models:eye.solid", 1);
+ eye.Scale(.03, .03, .03);
+ eye.CalculateNormals(0);
+
+ cornea.load((char *)":Data:Models:cornea.solid", 1);
+ cornea.Scale(.03, .03, .03);
+ cornea.CalculateNormals(0);
+
+ iris.load((char *)":Data:Models:iris.solid", 1);
+ iris.Scale(.03, .03, .03);
+ iris.CalculateNormals(0);
+
+ LoadSave(":Data:Textures:Bloodfur.png", 0, 1, &bloodText[0], 0);
+ LoadSave(":Data:Textures:Wolfbloodfur.png", 0, 1, &wolfbloodText[0], 0);
+
+ oldenvironment = -4;
+
+ gameon = 1;
+ mainmenu = 0;
+
+ firstload = 0;
+
+ loadAllAnimations();
+ //Fix knife stab, too lazy to do it manually
+ XYZ moveamount;
+ moveamount = 0;
+ moveamount.z = 2;
+ for (i = 0; i < player[0].skeleton.num_joints; i++) {
+ for (j = 0; j < animation[knifesneakattackanim].numframes; j++) {
+ animation[knifesneakattackanim].position[i][j] += moveamount;
+ }
+ }
+
+ LoadingScreen();
+
+ for (i = 0; i < player[0].skeleton.num_joints; i++) {
+ for (j = 0; j < animation[knifesneakattackedanim].numframes; j++) {
+ animation[knifesneakattackedanim].position[i][j] += moveamount;
+ }
+ }
+
+ LoadingScreen();
+
+ for (i = 0; i < player[0].skeleton.num_joints; i++) {
+ animation[dead1anim].position[i][1] = animation[dead1anim].position[i][0];
+ animation[dead2anim].position[i][1] = animation[dead2anim].position[i][0];
+ animation[dead3anim].position[i][1] = animation[dead3anim].position[i][0];
+ animation[dead4anim].position[i][1] = animation[dead4anim].position[i][0];
+ }
+ animation[dead1anim].speed[0] = 0.001;
+ animation[dead2anim].speed[0] = 0.001;
+ animation[dead3anim].speed[0] = 0.001;
+ animation[dead4anim].speed[0] = 0.001;
+
+ animation[dead1anim].speed[1] = 0.001;
+ animation[dead2anim].speed[1] = 0.001;
+ animation[dead3anim].speed[1] = 0.001;
+ animation[dead4anim].speed[1] = 0.001;
+
+ for (i = 0; i < player[0].skeleton.num_joints; i++) {
+ for (j = 0; j < animation[swordsneakattackanim].numframes; j++) {
+ animation[swordsneakattackanim].position[i][j] += moveamount;
+ }
+ }
+ LoadingScreen();
+ for (j = 0; j < animation[swordsneakattackanim].numframes; j++) {
+ animation[swordsneakattackanim].weapontarget[j] += moveamount;
+ }
+
+ LoadingScreen();
+
+ for (i = 0; i < player[0].skeleton.num_joints; i++) {
+ for (j = 0; j < animation[swordsneakattackedanim].numframes; j++) {
+ animation[swordsneakattackedanim].position[i][j] += moveamount;
+ }
+ }
+
+ LoadingScreen();
+ temptexdetail = texdetail;
+ texdetail = 1;
+ texdetail = temptexdetail;
+
+ LoadingScreen();
+
+ if (!screentexture) {
LoadScreenTexture();
- }
+ }
- if(targetlevel!=7){
- emit_sound_at(fireendsound);
- }
+ if (targetlevel != 7) {
+ emit_sound_at(fireendsound);
+ }
- stillloading=0;
- loading=0;
- changedelay=1;
+ stillloading = 0;
+ loading = 0;
+ changedelay = 1;
- visibleloading=0;
+ visibleloading = 0;
}
// Added more evilness needed for MSVC
#ifdef _MSC_VER
- #define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n)
- #define snprintf(buf, size, format, ...) _sprintf_p(buf, size, format)
+#define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n)
+#define snprintf(buf, size, format, ...) _sprintf_p(buf, size, format)
#endif
extern XYZ viewer;
extern int environment;
extern Terrain terrain;
-extern float screenwidth,screenheight;
+extern float screenwidth, screenheight;
extern float gravity;
extern int detail;
extern float texdetail;
extern bool ismotionblur;
extern bool showdamagebar; // (des)activate the damage bar
extern bool decals;
-extern float tintr,tintg,tintb;
+extern float tintr, tintg, tintb;
extern bool skyboxtexture;
extern float skyboxr;
extern float skyboxg;
-class CampaignLevel {
+class CampaignLevel
+{
private:
- int width;
- struct Position { int x,y; };
-public:
- std::string mapname;
- std::string description;
- int choosenext;
- /*
- 0 = Immediately load next level at the end of this one.
- 1 = Go back to the world map.
- 2 = Don't bring up the Fiery loading screen. Maybe other things, I've not investigated.
- */
- //int numnext; // 0 on final level. As David said: he meant to add story branching, but he eventually hadn't.
- std::vector<int> nextlevel;
- Position location;
- CampaignLevel() : width(10) {
- choosenext = 1;
- location.x = 0;
- location.y = 0;
- }
- int getStartX() { return 30+120+location.x*400/512; }
- int getStartY() { return 30+30+(512-location.y)*400/512; }
- int getEndX() { return getStartX()+width; }
- int getEndY() { return getStartY()+width; }
- XYZ getCenter() {
- XYZ center;
- center.x=getStartX()+width/2;
- center.y=getStartY()+width/2;
- return center;
- }
- int getWidth() { return width; }
- istream& operator<< (istream& is) {
- is.ignore(256,':');
- is.ignore(256,':');
- is.ignore(256,' ');
- is >> mapname;
- is.ignore(256,':');
- is >> description;
- for(int pos = description.find('_');pos!=string::npos;pos = description.find('_',pos)) {
- description.replace(pos,1,1,' ');
- }
- is.ignore(256,':');
- is >> choosenext;
- is.ignore(256,':');
- int numnext,next;
- is >> numnext;
- for(int j=0;j<numnext;j++) {
- is.ignore(256,':');
- is >> next;
- nextlevel.push_back(next-1);
- }
- is.ignore(256,':');
- is >> location.x;
- is.ignore(256,':');
- is >> location.y;
- return is;
- }
- friend istream& operator>> (istream& is, CampaignLevel& cl) {
- return cl << is;
- }
+ int width;
+ struct Position {
+ int x, y;
+ };
+public:
+ std::string mapname;
+ std::string description;
+ int choosenext;
+ /*
+ 0 = Immediately load next level at the end of this one.
+ 1 = Go back to the world map.
+ 2 = Don't bring up the Fiery loading screen. Maybe other things, I've not investigated.
+ */
+ //int numnext; // 0 on final level. As David said: he meant to add story branching, but he eventually hadn't.
+ std::vector<int> nextlevel;
+ Position location;
+ CampaignLevel() : width(10) {
+ choosenext = 1;
+ location.x = 0;
+ location.y = 0;
+ }
+ int getStartX() {
+ return 30 + 120 + location.x * 400 / 512;
+ }
+ int getStartY() {
+ return 30 + 30 + (512 - location.y) * 400 / 512;
+ }
+ int getEndX() {
+ return getStartX() + width;
+ }
+ int getEndY() {
+ return getStartY() + width;
+ }
+ XYZ getCenter() {
+ XYZ center;
+ center.x = getStartX() + width / 2;
+ center.y = getStartY() + width / 2;
+ return center;
+ }
+ int getWidth() {
+ return width;
+ }
+ istream& operator<< (istream& is) {
+ is.ignore(256, ':');
+ is.ignore(256, ':');
+ is.ignore(256, ' ');
+ is >> mapname;
+ is.ignore(256, ':');
+ is >> description;
+ for (int pos = description.find('_'); pos != string::npos; pos = description.find('_', pos)) {
+ description.replace(pos, 1, 1, ' ');
+ }
+ is.ignore(256, ':');
+ is >> choosenext;
+ is.ignore(256, ':');
+ int numnext, next;
+ is >> numnext;
+ for (int j = 0; j < numnext; j++) {
+ is.ignore(256, ':');
+ is >> next;
+ nextlevel.push_back(next - 1);
+ }
+ is.ignore(256, ':');
+ is >> location.x;
+ is.ignore(256, ':');
+ is >> location.y;
+ return is;
+ }
+ friend istream& operator>> (istream& is, CampaignLevel& cl) {
+ return cl << is;
+ }
};
int indemo = 0;
static const char *rabbitskin[] = {
-":Data:Textures:Fur3.jpg",
-":Data:Textures:Fur.jpg",
-":Data:Textures:Fur2.jpg",
-":Data:Textures:Lynx.jpg",
-":Data:Textures:Otter.jpg",
-":Data:Textures:Opal.jpg",
-":Data:Textures:Sable.jpg",
-":Data:Textures:Chocolate.jpg",
-":Data:Textures:BW2.jpg",
-":Data:Textures:WB2.jpg"
+ ":Data:Textures:Fur3.jpg",
+ ":Data:Textures:Fur.jpg",
+ ":Data:Textures:Fur2.jpg",
+ ":Data:Textures:Lynx.jpg",
+ ":Data:Textures:Otter.jpg",
+ ":Data:Textures:Opal.jpg",
+ ":Data:Textures:Sable.jpg",
+ ":Data:Textures:Chocolate.jpg",
+ ":Data:Textures:BW2.jpg",
+ ":Data:Textures:WB2.jpg"
};
static const char *wolfskin[] = {
-":Data:Textures:Wolf.jpg",
-":Data:Textures:Darkwolf.jpg",
-":Data:Textures:Snowwolf.jpg"
+ ":Data:Textures:Wolf.jpg",
+ ":Data:Textures:Darkwolf.jpg",
+ ":Data:Textures:Snowwolf.jpg"
};
#define STATIC_ASSERT(x) extern int s_a_dummy[2 * (!!(x)) - 1];
/* Return true if PFX is a prefix of STR (case-insensitive). */
static bool stripfx(const char *str, const char *pfx)
{
- return !strncasecmp(str, pfx, strlen(pfx));
+ return !strncasecmp(str, pfx, strlen(pfx));
}
static const char *cmd_names[] = {
// utility functions
// TODO: this is slightly incorrect
-inline float roughDirection(XYZ vec){
+inline float roughDirection(XYZ vec)
+{
Normalise(&vec);
- float angle=-asin(-vec.x)*180/M_PI;
- if(vec.z<0)
- angle=180-angle;
+ float angle = -asin(-vec.x) * 180 / M_PI;
+ if (vec.z < 0)
+ angle = 180 - angle;
return angle;
}
-inline float roughDirectionTo(XYZ start, XYZ end){
- return roughDirection(end-start);
+inline float roughDirectionTo(XYZ start, XYZ end)
+{
+ return roughDirection(end - start);
}
-inline float pitchOf(XYZ vec){
+inline float pitchOf(XYZ vec)
+{
Normalise(&vec);
- return -asin(vec.y)*180/M_PI;
+ return -asin(vec.y) * 180 / M_PI;
+}
+inline float pitchTo(XYZ start, XYZ end)
+{
+ return pitchOf(end - start);
}
-inline float pitchTo(XYZ start, XYZ end){
- return pitchOf(end-start);
+inline float sq(float n)
+{
+ return n * n;
}
-inline float sq(float n) { return n*n; }
-inline float stepTowardf(float from, float to, float by){
- if(fabs(from-to)<by) return to;
- else if(from>to) return from-by;
- else return from+by;
+inline float stepTowardf(float from, float to, float by)
+{
+ if (fabs(from - to) < by) return to;
+ else if (from > to) return from - by;
+ else return from + by;
}
-void playdialogueboxsound(){
+void playdialogueboxsound()
+{
XYZ temppos;
- temppos=player[participantfocus[whichdialogue][indialogue]].coords;
- temppos=temppos-viewer;
+ temppos = player[participantfocus[whichdialogue][indialogue]].coords;
+ temppos = temppos - viewer;
Normalise(&temppos);
- temppos+=viewer;
-
- int sound=-1;
- switch(dialogueboxsound[whichdialogue][indialogue]){
- case -6: sound=alarmsound; break;
- case -4: sound=consolefailsound; break;
- case -3: sound=consolesuccesssound; break;
- case -2: sound=firestartsound; break;
- case -1: sound=fireendsound; break;
- case 1: sound=rabbitchitter; break;
- case 2: sound=rabbitchitter2; break;
- case 3: sound=rabbitpainsound; break;
- case 4: sound=rabbitpain1sound; break;
- case 5: sound=rabbitattacksound; break;
- case 6: sound=rabbitattack2sound; break;
- case 7: sound=rabbitattack3sound; break;
- case 8: sound=rabbitattack4sound; break;
- case 9: sound=growlsound; break;
- case 10: sound=growl2sound; break;
- case 11: sound=snarlsound; break;
- case 12: sound=snarl2sound; break;
- case 13: sound=barksound; break;
- case 14: sound=bark2sound; break;
- case 15: sound=bark3sound; break;
- case 16: sound=barkgrowlsound; break;
- default: break;
+ temppos += viewer;
+
+ int sound = -1;
+ switch (dialogueboxsound[whichdialogue][indialogue]) {
+ case -6:
+ sound = alarmsound;
+ break;
+ case -4:
+ sound = consolefailsound;
+ break;
+ case -3:
+ sound = consolesuccesssound;
+ break;
+ case -2:
+ sound = firestartsound;
+ break;
+ case -1:
+ sound = fireendsound;
+ break;
+ case 1:
+ sound = rabbitchitter;
+ break;
+ case 2:
+ sound = rabbitchitter2;
+ break;
+ case 3:
+ sound = rabbitpainsound;
+ break;
+ case 4:
+ sound = rabbitpain1sound;
+ break;
+ case 5:
+ sound = rabbitattacksound;
+ break;
+ case 6:
+ sound = rabbitattack2sound;
+ break;
+ case 7:
+ sound = rabbitattack3sound;
+ break;
+ case 8:
+ sound = rabbitattack4sound;
+ break;
+ case 9:
+ sound = growlsound;
+ break;
+ case 10:
+ sound = growl2sound;
+ break;
+ case 11:
+ sound = snarlsound;
+ break;
+ case 12:
+ sound = snarl2sound;
+ break;
+ case 13:
+ sound = barksound;
+ break;
+ case 14:
+ sound = bark2sound;
+ break;
+ case 15:
+ sound = bark3sound;
+ break;
+ case 16:
+ sound = barkgrowlsound;
+ break;
+ default:
+ break;
}
- if(sound!=-1)
+ if (sound != -1)
emit_sound_at(sound, temppos);
}
// ================================================================
-bool AddClothes(const char *fileName, GLubyte *array) {
- LOGFUNC;
- //Load Image
- unsigned char fileNamep[256];
- CopyCStringToPascal(fileName,fileNamep);
- bool opened;
- opened=upload_image( fileNamep ,1);
-
- float alphanum;
- //Is it valid?
- if(opened){
- if(tintr>1)tintr=1;
- if(tintg>1)tintg=1;
- if(tintb>1)tintb=1;
-
- if(tintr<0)tintr=0;
- if(tintg<0)tintg=0;
- if(tintb<0)tintb=0;
-
- int bytesPerPixel=texture.bpp/8;
-
- int tempnum=0;
- alphanum=255;
- for(int i=0;i<(int)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){
- if(bytesPerPixel==3)alphanum=255;
- else if((i+1)%4==0)alphanum=texture.data[i];
- //alphanum/=2;
- if((i+1)%4||bytesPerPixel==3){
- if((i%4)==0)texture.data[i]*=tintr;
- if((i%4)==1)texture.data[i]*=tintg;
- if((i%4)==2)texture.data[i]*=tintb;
- array[tempnum]=(float)array[tempnum]*(1-alphanum/255)+(float)texture.data[i]*(alphanum/255);
- tempnum++;
- }
- }
- }
- else return 0;
- return 1;
+bool AddClothes(const char *fileName, GLubyte *array)
+{
+ LOGFUNC;
+ //Load Image
+ unsigned char fileNamep[256];
+ CopyCStringToPascal(fileName, fileNamep);
+ bool opened;
+ opened = upload_image( fileNamep , 1);
+
+ float alphanum;
+ //Is it valid?
+ if (opened) {
+ if (tintr > 1)tintr = 1;
+ if (tintg > 1)tintg = 1;
+ if (tintb > 1)tintb = 1;
+
+ if (tintr < 0)tintr = 0;
+ if (tintg < 0)tintg = 0;
+ if (tintb < 0)tintb = 0;
+
+ int bytesPerPixel = texture.bpp / 8;
+
+ int tempnum = 0;
+ alphanum = 255;
+ for (int i = 0; i < (int)(texture.sizeY * texture.sizeX * bytesPerPixel); i++) {
+ if (bytesPerPixel == 3)alphanum = 255;
+ else if ((i + 1) % 4 == 0)alphanum = texture.data[i];
+ //alphanum/=2;
+ if ((i + 1) % 4 || bytesPerPixel == 3) {
+ if ((i % 4) == 0)texture.data[i] *= tintr;
+ if ((i % 4) == 1)texture.data[i] *= tintg;
+ if ((i % 4) == 2)texture.data[i] *= tintb;
+ array[tempnum] = (float)array[tempnum] * (1 - alphanum / 255) + (float)texture.data[i] * (alphanum / 255);
+ tempnum++;
+ }
+ }
+ } else return 0;
+ return 1;
}
static void ch_quit(const char *args)
{
- tryquit = 1;
+ tryquit = 1;
}
static void ch_map(const char *args)
{
- Loadlevel(args);
- whichlevel = -2;
- campaign = 0;
+ Loadlevel(args);
+ whichlevel = -2;
+ campaign = 0;
}
-static void ch_save(const char *args){
+static void ch_save(const char *args)
+{
char buf[64];
snprintf(buf, 63, ":Data:Maps:%s", args);
int mapvers = 12;
FILE *tfile;
- tfile=fopen( ConvertFileName(buf), "wb" );
+ tfile = fopen( ConvertFileName(buf), "wb" );
fpackf(tfile, "Bi", mapvers);
fpackf(tfile, "Bi", maptype);
fpackf(tfile, "Bi", hostile);
fpackf(tfile, "Bb Bf Bf Bf", skyboxtexture, skyboxr, skyboxg, skyboxb);
fpackf(tfile, "Bf Bf Bf", skyboxlightr, skyboxlightg, skyboxlightb);
fpackf(tfile, "Bf Bf Bf Bf Bf Bi", player[0].coords.x, player[0].coords.y, player[0].coords.z,
- player[0].yaw, player[0].targetyaw, player[0].num_weapons);
- if(player[0].num_weapons>0&&player[0].num_weapons<5)
- for(int j=0;j<player[0].num_weapons;j++)
- fpackf(tfile, "Bi", weapons[player[0].weaponids[j]].getType());
+ player[0].yaw, player[0].targetyaw, player[0].num_weapons);
+ if (player[0].num_weapons > 0 && player[0].num_weapons < 5)
+ for (int j = 0; j < player[0].num_weapons; j++)
+ fpackf(tfile, "Bi", weapons[player[0].weaponids[j]].getType());
fpackf(tfile, "Bf Bf Bf", player[0].armorhead, player[0].armorhigh, player[0].armorlow);
fpackf(tfile, "Bf Bf Bf", player[0].protectionhead, player[0].protectionhigh, player[0].protectionlow);
fpackf(tfile, "Bi", numdialogues);
- for(int k=0;k<numdialogues;k++){
- fpackf(tfile, "Bi", numdialogueboxes[k]);
- fpackf(tfile, "Bi", dialoguetype[k]);
- for(int l=0;l<10;l++){
- fpackf(tfile, "Bf Bf Bf", participantlocation[k][l].x, participantlocation[k][l].y, participantlocation[k][l].z);
- fpackf(tfile, "Bf", participantyaw[k][l]);
- }
- for(int l=0;l<numdialogueboxes[k];l++){
- fpackf(tfile, "Bi", dialogueboxlocation[k][l]);
- fpackf(tfile, "Bf", dialogueboxcolor[k][l][0]);
- fpackf(tfile, "Bf", dialogueboxcolor[k][l][1]);
- fpackf(tfile, "Bf", dialogueboxcolor[k][l][2]);
- fpackf(tfile, "Bi", dialogueboxsound[k][l]);
-
- int templength=strlen(dialoguetext[k][l]);
- fpackf(tfile, "Bi",(templength));
- for(int m=0;m<templength;m++){
- fpackf(tfile, "Bb", dialoguetext[k][l][m]);
- if(dialoguetext[k][l][m]=='\0')
+ for (int k = 0; k < numdialogues; k++) {
+ fpackf(tfile, "Bi", numdialogueboxes[k]);
+ fpackf(tfile, "Bi", dialoguetype[k]);
+ for (int l = 0; l < 10; l++) {
+ fpackf(tfile, "Bf Bf Bf", participantlocation[k][l].x, participantlocation[k][l].y, participantlocation[k][l].z);
+ fpackf(tfile, "Bf", participantyaw[k][l]);
+ }
+ for (int l = 0; l < numdialogueboxes[k]; l++) {
+ fpackf(tfile, "Bi", dialogueboxlocation[k][l]);
+ fpackf(tfile, "Bf", dialogueboxcolor[k][l][0]);
+ fpackf(tfile, "Bf", dialogueboxcolor[k][l][1]);
+ fpackf(tfile, "Bf", dialogueboxcolor[k][l][2]);
+ fpackf(tfile, "Bi", dialogueboxsound[k][l]);
+
+ int templength = strlen(dialoguetext[k][l]);
+ fpackf(tfile, "Bi", (templength));
+ for (int m = 0; m < templength; m++) {
+ fpackf(tfile, "Bb", dialoguetext[k][l][m]);
+ if (dialoguetext[k][l][m] == '\0')
break;
- }
+ }
- templength=strlen(dialoguename[k][l]);
- fpackf(tfile, "Bi",templength);
- for(int m=0;m<templength;m++){
- fpackf(tfile, "Bb", dialoguename[k][l][m]);
- if(dialoguename[k][l][m]=='\0')
+ templength = strlen(dialoguename[k][l]);
+ fpackf(tfile, "Bi", templength);
+ for (int m = 0; m < templength; m++) {
+ fpackf(tfile, "Bb", dialoguename[k][l][m]);
+ if (dialoguename[k][l][m] == '\0')
break;
- }
+ }
- fpackf(tfile, "Bf Bf Bf", dialoguecamera[k][l].x, dialoguecamera[k][l].y, dialoguecamera[k][l].z);
- fpackf(tfile, "Bi", participantfocus[k][l]);
- fpackf(tfile, "Bi", participantaction[k][l]);
+ fpackf(tfile, "Bf Bf Bf", dialoguecamera[k][l].x, dialoguecamera[k][l].y, dialoguecamera[k][l].z);
+ fpackf(tfile, "Bi", participantfocus[k][l]);
+ fpackf(tfile, "Bi", participantaction[k][l]);
- for(int m=0;m<10;m++)
- fpackf(tfile, "Bf Bf Bf", participantfacing[k][l][m].x, participantfacing[k][l][m].y, participantfacing[k][l][m].z);
+ for (int m = 0; m < 10; m++)
+ fpackf(tfile, "Bf Bf Bf", participantfacing[k][l][m].x, participantfacing[k][l][m].y, participantfacing[k][l][m].z);
- fpackf(tfile, "Bf Bf",dialoguecamerayaw[k][l],dialoguecamerapitch[k][l]);
- }
- }
+ fpackf(tfile, "Bf Bf", dialoguecamerayaw[k][l], dialoguecamerapitch[k][l]);
+ }
+ }
- for(int k=0;k<player[0].numclothes;k++){
- int templength=strlen(player[0].clothes[k]);
- fpackf(tfile, "Bi", templength);
- for(int l=0;l<templength;l++)
- fpackf(tfile, "Bb", player[0].clothes[k][l]);
- fpackf(tfile, "Bf Bf Bf", player[0].clothestintr[k], player[0].clothestintg[k], player[0].clothestintb[k]);
- }
+ for (int k = 0; k < player[0].numclothes; k++) {
+ int templength = strlen(player[0].clothes[k]);
+ fpackf(tfile, "Bi", templength);
+ for (int l = 0; l < templength; l++)
+ fpackf(tfile, "Bb", player[0].clothes[k][l]);
+ fpackf(tfile, "Bf Bf Bf", player[0].clothestintr[k], player[0].clothestintg[k], player[0].clothestintb[k]);
+ }
fpackf(tfile, "Bi", environment);
fpackf(tfile, "Bi", objects.numobjects);
- for(int k=0;k<objects.numobjects;k++)
+ for (int k = 0; k < objects.numobjects; k++)
fpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", objects.type[k], objects.yaw[k], objects.pitch[k],
- objects.position[k].x, objects.position[k].y, objects.position[k].z, objects.scale[k]);
+ objects.position[k].x, objects.position[k].y, objects.position[k].z, objects.scale[k]);
fpackf(tfile, "Bi", numhotspots);
- for(int i=0;i<numhotspots;i++){
- fpackf(tfile, "Bi Bf Bf Bf Bf", hotspottype[i],hotspotsize[i],hotspot[i].x,hotspot[i].y,hotspot[i].z);
- int templength=strlen(hotspottext[i]);
- fpackf(tfile, "Bi",templength);
- for(int l=0;l<templength;l++)
- fpackf(tfile, "Bb", hotspottext[i][l]);
- }
+ for (int i = 0; i < numhotspots; i++) {
+ fpackf(tfile, "Bi Bf Bf Bf Bf", hotspottype[i], hotspotsize[i], hotspot[i].x, hotspot[i].y, hotspot[i].z);
+ int templength = strlen(hotspottext[i]);
+ fpackf(tfile, "Bi", templength);
+ for (int l = 0; l < templength; l++)
+ fpackf(tfile, "Bb", hotspottext[i][l]);
+ }
fpackf(tfile, "Bi", numplayers);
- if(numplayers<maxplayers)
- for(int j=1;j<numplayers;j++){
+ if (numplayers < maxplayers)
+ for (int j = 1; j < numplayers; j++) {
fpackf(tfile, "Bi Bi Bf Bf Bf Bi Bi Bf Bb Bf", player[j].whichskin, player[j].creature,
- player[j].coords.x, player[j].coords.y, player[j].coords.z,
- player[j].num_weapons, player[j].howactive, player[j].scale, player[j].immobile, player[j].yaw);
- if(player[j].num_weapons<5)
- for(int k=0;k<player[j].num_weapons;k++)
+ player[j].coords.x, player[j].coords.y, player[j].coords.z,
+ player[j].num_weapons, player[j].howactive, player[j].scale, player[j].immobile, player[j].yaw);
+ if (player[j].num_weapons < 5)
+ for (int k = 0; k < player[j].num_weapons; k++)
fpackf(tfile, "Bi", weapons[player[j].weaponids[k]].getType());
- if(player[j].numwaypoints<30){
+ if (player[j].numwaypoints < 30) {
fpackf(tfile, "Bi", player[j].numwaypoints);
- for(int k=0;k<player[j].numwaypoints;k++){
+ for (int k = 0; k < player[j].numwaypoints; k++) {
fpackf(tfile, "Bf", player[j].waypoints[k].x);
fpackf(tfile, "Bf", player[j].waypoints[k].y);
fpackf(tfile, "Bf", player[j].waypoints[k].z);
fpackf(tfile, "Bi", player[j].waypointtype[k]);
}
fpackf(tfile, "Bi", player[j].waypoint);
- }else{
- player[j].numwaypoints=0;
- player[j].waypoint=0;
+ } else {
+ player[j].numwaypoints = 0;
+ player[j].waypoint = 0;
fpackf(tfile, "Bi Bi Bi", player[j].numwaypoints, player[j].waypoint, player[j].waypoint);
}
fpackf(tfile, "Bf Bf", player[j].power, player[j].speedmult);
float headprop, bodyprop, armprop, legprop;
- if(player[j].creature==wolftype){
- headprop=player[j].proportionhead.x/1.1;
- bodyprop=player[j].proportionbody.x/1.1;
- armprop=player[j].proportionarms.x/1.1;
- legprop=player[j].proportionlegs.x/1.1;
- }else if(player[j].creature==rabbittype){
- headprop=player[j].proportionhead.x/1.2;
- bodyprop=player[j].proportionbody.x/1.05;
- armprop=player[j].proportionarms.x/1.00;
- legprop=player[j].proportionlegs.x/1.1;
+ if (player[j].creature == wolftype) {
+ headprop = player[j].proportionhead.x / 1.1;
+ bodyprop = player[j].proportionbody.x / 1.1;
+ armprop = player[j].proportionarms.x / 1.1;
+ legprop = player[j].proportionlegs.x / 1.1;
+ } else if (player[j].creature == rabbittype) {
+ headprop = player[j].proportionhead.x / 1.2;
+ bodyprop = player[j].proportionbody.x / 1.05;
+ armprop = player[j].proportionarms.x / 1.00;
+ legprop = player[j].proportionlegs.x / 1.1;
}
fpackf(tfile, "Bf Bf Bf Bf", headprop, bodyprop, armprop, legprop);
fpackf(tfile, "Bi", player[j].numclothes);
- if(player[j].numclothes)
- for(int k=0;k<player[j].numclothes;k++){
+ if (player[j].numclothes)
+ for (int k = 0; k < player[j].numclothes; k++) {
int templength;
- templength=strlen(player[j].clothes[k]);
+ templength = strlen(player[j].clothes[k]);
fpackf(tfile, "Bi", templength);
- for(int l=0;l<templength;l++)
+ for (int l = 0; l < templength; l++)
fpackf(tfile, "Bb", player[j].clothes[k][l]);
fpackf(tfile, "Bf Bf Bf", player[j].clothestintr[k], player[j].clothestintg[k], player[j].clothestintb[k]);
}
}
fpackf(tfile, "Bi", numpathpoints);
- for(int j=0;j<numpathpoints;j++){
- fpackf(tfile, "Bf Bf Bf Bi", pathpoint[j].x, pathpoint[j].y, pathpoint[j].z, numpathpointconnect[j]);
- for(int k=0;k<numpathpointconnect[j];k++)
- fpackf(tfile, "Bi", pathpointconnect[j][k]);
- }
+ for (int j = 0; j < numpathpoints; j++) {
+ fpackf(tfile, "Bf Bf Bf Bi", pathpoint[j].x, pathpoint[j].y, pathpoint[j].z, numpathpointconnect[j]);
+ for (int k = 0; k < numpathpointconnect[j]; k++)
+ fpackf(tfile, "Bi", pathpointconnect[j][k]);
+ }
fpackf(tfile, "Bf Bf Bf Bf", mapcenter.x, mapcenter.y, mapcenter.z, mapradius);
static void ch_cellar(const char *args)
{
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Furdarko.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Furdarko.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
}
static void ch_tint(const char *args)
{
- sscanf(args, "%f%f%f", &tintr, &tintg, &tintb);
+ sscanf(args, "%f%f%f", &tintr, &tintg, &tintb);
}
static void ch_tintr(const char *args)
{
- tintr = atof(args);
+ tintr = atof(args);
}
static void ch_tintg(const char *args)
{
- tintg = atof(args);
+ tintg = atof(args);
}
static void ch_tintb(const char *args)
{
- tintb = atof(args);
+ tintb = atof(args);
}
static void ch_speed(const char *args)
{
- player[0].speedmult = atof(args);
+ player[0].speedmult = atof(args);
}
static void ch_strength(const char *args)
{
- player[0].power = atof(args);
+ player[0].power = atof(args);
}
static void ch_power(const char *args)
{
- player[0].power = atof(args);
+ player[0].power = atof(args);
}
static void ch_size(const char *args)
{
- player[0].scale = atof(args) * .2;
+ player[0].scale = atof(args) * .2;
}
-static int findClosestPlayer(){
+static int findClosestPlayer()
+{
int closest = -1;
float closestdist = std::numeric_limits<float>::max();
- for(int i=1; i<numplayers; i++){
+ for (int i = 1; i < numplayers; i++) {
float distance = distsq(&player[i].coords, &player[0].coords);
- if(distance < closestdist){
+ if (distance < closestdist) {
closestdist = distance;
closest = i;
}
return closest;
}
-static int findClosestObject(){
+static int findClosestObject()
+{
int closest = -1;
float closestdist = std::numeric_limits<float>::max();
- for(int i=0; i<objects.numobjects; i++){
+ for (int i = 0; i < objects.numobjects; i++) {
float distance = distsq(&objects.position[i], &player[0].coords);
- if(distance < closestdist){
+ if (distance < closestdist) {
closestdist = distance;
closest = i;
}
static void ch_sizenear(const char *args)
{
- int closest = findClosestPlayer();
- if(closest>=0)
- player[closest].scale = atof(args) * .2;
+ int closest = findClosestPlayer();
+ if (closest >= 0)
+ player[closest].scale = atof(args) * .2;
}
static void set_proportion(int pnum, const char *args)
{
- float headprop,bodyprop,armprop,legprop;
-
- sscanf(args, "%f%f%f%f", &headprop, &bodyprop, &armprop, &legprop);
-
- if(player[pnum].creature==wolftype){
- player[pnum].proportionhead=1.1*headprop;
- player[pnum].proportionbody=1.1*bodyprop;
- player[pnum].proportionarms=1.1*armprop;
- player[pnum].proportionlegs=1.1*legprop;
- } else if(player[pnum].creature==rabbittype){
- player[pnum].proportionhead=1.2*headprop;
- player[pnum].proportionbody=1.05*bodyprop;
- player[pnum].proportionarms=1.00*armprop;
- player[pnum].proportionlegs=1.1*legprop;
- player[pnum].proportionlegs.y=1.05*legprop;
- }
+ float headprop, bodyprop, armprop, legprop;
+
+ sscanf(args, "%f%f%f%f", &headprop, &bodyprop, &armprop, &legprop);
+
+ if (player[pnum].creature == wolftype) {
+ player[pnum].proportionhead = 1.1 * headprop;
+ player[pnum].proportionbody = 1.1 * bodyprop;
+ player[pnum].proportionarms = 1.1 * armprop;
+ player[pnum].proportionlegs = 1.1 * legprop;
+ } else if (player[pnum].creature == rabbittype) {
+ player[pnum].proportionhead = 1.2 * headprop;
+ player[pnum].proportionbody = 1.05 * bodyprop;
+ player[pnum].proportionarms = 1.00 * armprop;
+ player[pnum].proportionlegs = 1.1 * legprop;
+ player[pnum].proportionlegs.y = 1.05 * legprop;
+ }
}
static void ch_proportion(const char *args)
{
- set_proportion(0, args);
+ set_proportion(0, args);
}
static void ch_proportionnear(const char *args)
{
- int closest = findClosestPlayer();
- if(closest>=0)
- set_proportion(closest, args);
+ int closest = findClosestPlayer();
+ if (closest >= 0)
+ set_proportion(closest, args);
}
static void set_protection(int pnum, const char *args)
{
- float head, high, low;
- sscanf(args, "%f%f%f", &head, &high, &low);
+ float head, high, low;
+ sscanf(args, "%f%f%f", &head, &high, &low);
- player[pnum].protectionhead = head;
- player[pnum].protectionhigh = high;
- player[pnum].protectionlow = low;
+ player[pnum].protectionhead = head;
+ player[pnum].protectionhigh = high;
+ player[pnum].protectionlow = low;
}
static void ch_protection(const char *args)
{
- set_protection(0, args);
+ set_protection(0, args);
}
static void ch_protectionnear(const char *args)
{
- int closest = findClosestPlayer();
- if(closest>=0)
- set_protection(closest, args);
+ int closest = findClosestPlayer();
+ if (closest >= 0)
+ set_protection(closest, args);
}
static void set_armor(int pnum, const char *args)
{
- float head, high, low;
- sscanf(args, "%f%f%f", &head, &high, &low);
+ float head, high, low;
+ sscanf(args, "%f%f%f", &head, &high, &low);
- player[pnum].armorhead = head;
- player[pnum].armorhigh = high;
- player[pnum].armorlow = low;
+ player[pnum].armorhead = head;
+ player[pnum].armorhigh = high;
+ player[pnum].armorlow = low;
}
static void ch_armor(const char *args)
{
- set_armor(0, args);
+ set_armor(0, args);
}
static void ch_armornear(const char *args)
{
- int closest = findClosestPlayer();
- if(closest>=0)
- set_armor(closest, args);
+ int closest = findClosestPlayer();
+ if (closest >= 0)
+ set_armor(closest, args);
}
static void ch_protectionreset(const char *args)
{
- set_protection(0, "1 1 1");
- set_armor(0, "1 1 1");
+ set_protection(0, "1 1 1");
+ set_armor(0, "1 1 1");
}
static void set_metal(int pnum, const char *args)
{
- float head, high, low;
- sscanf(args, "%f%f%f", &head, &high, &low);
+ float head, high, low;
+ sscanf(args, "%f%f%f", &head, &high, &low);
- player[pnum].metalhead = head;
- player[pnum].metalhigh = high;
- player[pnum].metallow = low;
+ player[pnum].metalhead = head;
+ player[pnum].metalhigh = high;
+ player[pnum].metallow = low;
}
static void ch_metal(const char *args)
{
- set_metal(0, args);
+ set_metal(0, args);
}
static void set_noclothes(int pnum, const char *args)
{
- player[pnum].numclothes = 0;
- player[pnum].skeleton.drawmodel.textureptr.load(
- creatureskin[player[pnum].creature][player[pnum].whichskin],1,
- &player[pnum].skeleton.skinText[0],&player[pnum].skeleton.skinsize);
+ player[pnum].numclothes = 0;
+ player[pnum].skeleton.drawmodel.textureptr.load(
+ creatureskin[player[pnum].creature][player[pnum].whichskin], 1,
+ &player[pnum].skeleton.skinText[0], &player[pnum].skeleton.skinsize);
}
static void ch_noclothes(const char *args)
{
- set_noclothes(0, args);
+ set_noclothes(0, args);
}
static void ch_noclothesnear(const char *args)
{
- int closest = findClosestPlayer();
- if(closest>=0)
- set_noclothes(closest, args);
+ int closest = findClosestPlayer();
+ if (closest >= 0)
+ set_noclothes(closest, args);
}
static void set_clothes(int pnum, const char *args)
{
- char buf[64];
- snprintf(buf, 63, ":Data:Textures:%s.png", args);
-
- if (!AddClothes(buf,&player[pnum].skeleton.skinText[pnum]))
- return;
-
- player[pnum].DoMipmaps();
- strcpy(player[pnum].clothes[player[pnum].numclothes],buf);
- player[pnum].clothestintr[player[pnum].numclothes]=tintr;
- player[pnum].clothestintg[player[pnum].numclothes]=tintg;
- player[pnum].clothestintb[player[pnum].numclothes]=tintb;
- player[pnum].numclothes++;
+ char buf[64];
+ snprintf(buf, 63, ":Data:Textures:%s.png", args);
+
+ if (!AddClothes(buf, &player[pnum].skeleton.skinText[pnum]))
+ return;
+
+ player[pnum].DoMipmaps();
+ strcpy(player[pnum].clothes[player[pnum].numclothes], buf);
+ player[pnum].clothestintr[player[pnum].numclothes] = tintr;
+ player[pnum].clothestintg[player[pnum].numclothes] = tintg;
+ player[pnum].clothestintb[player[pnum].numclothes] = tintb;
+ player[pnum].numclothes++;
}
static void ch_clothes(const char *args)
{
- set_clothes(0, args);
+ set_clothes(0, args);
}
static void ch_clothesnear(const char *args)
{
- int closest = findClosestPlayer();
- if(closest>=0)
- set_clothes(closest, args);
+ int closest = findClosestPlayer();
+ if (closest >= 0)
+ set_clothes(closest, args);
}
static void ch_belt(const char *args)
{
- player[0].skeleton.clothes = !player[0].skeleton.clothes;
+ player[0].skeleton.clothes = !player[0].skeleton.clothes;
}
static void ch_cellophane(const char *args)
{
- cellophane = !cellophane;
- float mul = cellophane ? 0 : 1;
-
- for (int i = 0; i < numplayers; i++) {
- player[i].proportionhead.z = player[i].proportionhead.x * mul;
- player[i].proportionbody.z = player[i].proportionbody.x * mul;
- player[i].proportionarms.z = player[i].proportionarms.x * mul;
- player[i].proportionlegs.z = player[i].proportionlegs.x * mul;
- }
+ cellophane = !cellophane;
+ float mul = cellophane ? 0 : 1;
+
+ for (int i = 0; i < numplayers; i++) {
+ player[i].proportionhead.z = player[i].proportionhead.x * mul;
+ player[i].proportionbody.z = player[i].proportionbody.x * mul;
+ player[i].proportionarms.z = player[i].proportionarms.x * mul;
+ player[i].proportionlegs.z = player[i].proportionlegs.x * mul;
+ }
}
static void ch_funnybunny(const char *args)
{
- player[0].skeleton.id=0;
- player[0].skeleton.Load(":Data:Skeleton:Basic Figure",":Data:Skeleton:Basic Figurelow",
- ":Data:Skeleton:Rabbitbelt",":Data:Models:Body.solid",
- ":Data:Models:Body2.solid",":Data:Models:Body3.solid",
- ":Data:Models:Body4.solid",":Data:Models:Body5.solid",
- ":Data:Models:Body6.solid",":Data:Models:Body7.solid",
- ":Data:Models:Bodylow.solid",":Data:Models:Belt.solid",1);
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
- player[0].creature=rabbittype;
- player[0].scale=.2;
- player[0].headless=0;
- player[0].damagetolerance=200;
- set_proportion(0, "1 1 1 1");
+ player[0].skeleton.id = 0;
+ player[0].skeleton.Load(":Data:Skeleton:Basic Figure", ":Data:Skeleton:Basic Figurelow",
+ ":Data:Skeleton:Rabbitbelt", ":Data:Models:Body.solid",
+ ":Data:Models:Body2.solid", ":Data:Models:Body3.solid",
+ ":Data:Models:Body4.solid", ":Data:Models:Body5.solid",
+ ":Data:Models:Body6.solid", ":Data:Models:Body7.solid",
+ ":Data:Models:Bodylow.solid", ":Data:Models:Belt.solid", 1);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
+ player[0].creature = rabbittype;
+ player[0].scale = .2;
+ player[0].headless = 0;
+ player[0].damagetolerance = 200;
+ set_proportion(0, "1 1 1 1");
}
static void ch_wolfie(const char *args)
{
- player[0].skeleton.id=0;
- player[0].skeleton.Load(":Data:Skeleton:Basic Figure Wolf",":Data:Skeleton:Basic Figure Wolf Low",
- ":Data:Skeleton:Rabbitbelt",":Data:Models:Wolf.solid",
- ":Data:Models:Wolf2.solid",":Data:Models:Wolf3.solid",
- ":Data:Models:Wolf4.solid",":Data:Models:Wolf5.solid",
- ":Data:Models:Wolf6.solid",":Data:Models:Wolf7.solid",
- ":Data:Models:Wolflow.solid",":Data:Models:Belt.solid",0);
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
- player[0].creature=wolftype;
- player[0].damagetolerance=300;
- set_proportion(0, "1 1 1 1");
+ player[0].skeleton.id = 0;
+ player[0].skeleton.Load(":Data:Skeleton:Basic Figure Wolf", ":Data:Skeleton:Basic Figure Wolf Low",
+ ":Data:Skeleton:Rabbitbelt", ":Data:Models:Wolf.solid",
+ ":Data:Models:Wolf2.solid", ":Data:Models:Wolf3.solid",
+ ":Data:Models:Wolf4.solid", ":Data:Models:Wolf5.solid",
+ ":Data:Models:Wolf6.solid", ":Data:Models:Wolf7.solid",
+ ":Data:Models:Wolflow.solid", ":Data:Models:Belt.solid", 0);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
+ player[0].creature = wolftype;
+ player[0].damagetolerance = 300;
+ set_proportion(0, "1 1 1 1");
}
static void ch_wolfieisgod(const char *args)
{
- ch_wolfie(args);
+ ch_wolfie(args);
}
static void ch_wolf(const char *args)
{
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
}
static void ch_snowwolf(const char *args)
{
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:SnowWolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:SnowWolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
}
static void ch_darkwolf(const char *args)
{
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:DarkWolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:DarkWolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
}
static void ch_lizardwolf(const char *args)
{
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Lizardwolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Lizardwolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
}
static void ch_white(const char *args)
{
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
}
static void ch_brown(const char *args)
{
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
}
static void ch_black(const char *args)
{
- player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur2.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+ player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur2.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
}
static void ch_sizemin(const char *args)
{
- for (int i = 1; i < numplayers; i++)
- if (player[i].scale < 0.8 * 0.2)
- player[i].scale = 0.8 * 0.2;
+ for (int i = 1; i < numplayers; i++)
+ if (player[i].scale < 0.8 * 0.2)
+ player[i].scale = 0.8 * 0.2;
}
static void ch_tutorial(const char *args)
{
- tutoriallevel = atoi(args);
+ tutoriallevel = atoi(args);
}
static void ch_hostile(const char *args)
{
- hostile = atoi(args);
+ hostile = atoi(args);
}
static void ch_indemo(const char *args)
{
- indemo=1;
- hotspot[numhotspots]=player[0].coords;
- hotspotsize[numhotspots]=0;
- hotspottype[numhotspots]=-111;
- strcpy(hotspottext[numhotspots],"mapname");
- numhotspots++;
+ indemo = 1;
+ hotspot[numhotspots] = player[0].coords;
+ hotspotsize[numhotspots] = 0;
+ hotspottype[numhotspots] = -111;
+ strcpy(hotspottext[numhotspots], "mapname");
+ numhotspots++;
}
static void ch_notindemo(const char *args)
{
- indemo=0;
- numhotspots--;
+ indemo = 0;
+ numhotspots--;
}
static void ch_type(const char *args)
{
- int n = sizeof(editortypenames) / sizeof(editortypenames[0]);
- for (int i = 0; i < n; i++)
- if (stripfx(args, editortypenames[i])) {
- editoractive = i;
- break;
- }
+ int n = sizeof(editortypenames) / sizeof(editortypenames[0]);
+ for (int i = 0; i < n; i++)
+ if (stripfx(args, editortypenames[i])) {
+ editoractive = i;
+ break;
+ }
}
static void ch_path(const char *args)
{
- int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]);
- for (int i = 0; i < n; i++)
- if (stripfx(args, pathtypenames[i])) {
- editorpathtype = i;
- break;
- }
+ int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]);
+ for (int i = 0; i < n; i++)
+ if (stripfx(args, pathtypenames[i])) {
+ editorpathtype = i;
+ break;
+ }
}
static void ch_hs(const char *args)
{
- hotspot[numhotspots]=player[0].coords;
+ hotspot[numhotspots] = player[0].coords;
- float size;
- int type, shift;
- sscanf(args, "%f%d %n", &size, &type, &shift);
+ float size;
+ int type, shift;
+ sscanf(args, "%f%d %n", &size, &type, &shift);
- hotspotsize[numhotspots] = size;
- hotspottype[numhotspots] = type;
+ hotspotsize[numhotspots] = size;
+ hotspottype[numhotspots] = type;
- strcpy(hotspottext[numhotspots], args + shift);
- strcat(hotspottext[numhotspots], "\n");
+ strcpy(hotspottext[numhotspots], args + shift);
+ strcat(hotspottext[numhotspots], "\n");
- numhotspots++;
+ numhotspots++;
}
static void ch_dialogue(const char *args)
{
- int dlg;
- char buf1[32], buf2[64];
-
- sscanf(args, "%d %31s", &dlg, buf1);
- snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
-
- dialoguetype[numdialogues] = dlg;
-
- memset(dialoguetext[numdialogues], 0, sizeof(dialoguetext[numdialogues]));
- memset(dialoguename[numdialogues], 0, sizeof(dialoguename[numdialogues]));
-
- ifstream ipstream(ConvertFileName(buf2));
- ipstream.ignore(256,':');
- ipstream >> numdialogueboxes[numdialogues];
- for(int i=0;i<numdialogueboxes[numdialogues];i++){
- ipstream.ignore(256,':');
- ipstream.ignore(256,':');
- ipstream.ignore(256,' ');
- ipstream >> dialogueboxlocation[numdialogues][i];
- ipstream.ignore(256,':');
- ipstream >> dialogueboxcolor[numdialogues][i][0];
- ipstream >> dialogueboxcolor[numdialogues][i][1];
- ipstream >> dialogueboxcolor[numdialogues][i][2];
- ipstream.ignore(256,':');
- ipstream.getline(dialoguename[numdialogues][i],64);
- ipstream.ignore(256,':');
- ipstream.ignore(256,' ');
- ipstream.getline(dialoguetext[numdialogues][i],128);
- for(int j=0;j<128;j++){
- if(dialoguetext[numdialogues][i][j]=='\\')dialoguetext[numdialogues][i][j]='\n';
+ int dlg;
+ char buf1[32], buf2[64];
+
+ sscanf(args, "%d %31s", &dlg, buf1);
+ snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
+
+ dialoguetype[numdialogues] = dlg;
+
+ memset(dialoguetext[numdialogues], 0, sizeof(dialoguetext[numdialogues]));
+ memset(dialoguename[numdialogues], 0, sizeof(dialoguename[numdialogues]));
+
+ ifstream ipstream(ConvertFileName(buf2));
+ ipstream.ignore(256, ':');
+ ipstream >> numdialogueboxes[numdialogues];
+ for (int i = 0; i < numdialogueboxes[numdialogues]; i++) {
+ ipstream.ignore(256, ':');
+ ipstream.ignore(256, ':');
+ ipstream.ignore(256, ' ');
+ ipstream >> dialogueboxlocation[numdialogues][i];
+ ipstream.ignore(256, ':');
+ ipstream >> dialogueboxcolor[numdialogues][i][0];
+ ipstream >> dialogueboxcolor[numdialogues][i][1];
+ ipstream >> dialogueboxcolor[numdialogues][i][2];
+ ipstream.ignore(256, ':');
+ ipstream.getline(dialoguename[numdialogues][i], 64);
+ ipstream.ignore(256, ':');
+ ipstream.ignore(256, ' ');
+ ipstream.getline(dialoguetext[numdialogues][i], 128);
+ for (int j = 0; j < 128; j++) {
+ if (dialoguetext[numdialogues][i][j] == '\\')dialoguetext[numdialogues][i][j] = '\n';
+ }
+ ipstream.ignore(256, ':');
+ ipstream >> dialogueboxsound[numdialogues][i];
}
- ipstream.ignore(256,':');
- ipstream >> dialogueboxsound[numdialogues][i];
- }
- for(int i=0;i<numdialogueboxes[numdialogues];i++){
- for(int j=0;j<numplayers;j++){
- participantfacing[numdialogues][i][j]=player[j].facing;
+ for (int i = 0; i < numdialogueboxes[numdialogues]; i++) {
+ for (int j = 0; j < numplayers; j++) {
+ participantfacing[numdialogues][i][j] = player[j].facing;
+ }
}
- }
- ipstream.close();
+ ipstream.close();
- directing=1;
- indialogue=0;
- whichdialogue=numdialogues;
+ directing = 1;
+ indialogue = 0;
+ whichdialogue = numdialogues;
- numdialogues++;
+ numdialogues++;
}
static void ch_fixdialogue(const char *args)
{
- char buf1[32], buf2[64];
- int whichdi;
-
- sscanf(args, "%d %31s", &whichdi, buf1);
- snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
-
- memset(dialoguetext[whichdi], 0, sizeof(dialoguetext[whichdi]));
- memset(dialoguename[whichdi], 0, sizeof(dialoguename[whichdi]));
-
- ifstream ipstream(ConvertFileName(buf2));
- ipstream.ignore(256,':');
- ipstream >> numdialogueboxes[whichdi];
- for(int i=0;i<numdialogueboxes[whichdi];i++){
- ipstream.ignore(256,':');
- ipstream.ignore(256,':');
- ipstream.ignore(256,' ');
- ipstream >> dialogueboxlocation[whichdi][i];
- ipstream.ignore(256,':');
- ipstream >> dialogueboxcolor[whichdi][i][0];
- ipstream >> dialogueboxcolor[whichdi][i][1];
- ipstream >> dialogueboxcolor[whichdi][i][2];
- ipstream.ignore(256,':');
- ipstream.getline(dialoguename[whichdi][i],64);
- ipstream.ignore(256,':');
- ipstream.ignore(256,' ');
- ipstream.getline(dialoguetext[whichdi][i],128);
- for(int j=0;j<128;j++){
- if(dialoguetext[whichdi][i][j]=='\\')dialoguetext[whichdi][i][j]='\n';
+ char buf1[32], buf2[64];
+ int whichdi;
+
+ sscanf(args, "%d %31s", &whichdi, buf1);
+ snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
+
+ memset(dialoguetext[whichdi], 0, sizeof(dialoguetext[whichdi]));
+ memset(dialoguename[whichdi], 0, sizeof(dialoguename[whichdi]));
+
+ ifstream ipstream(ConvertFileName(buf2));
+ ipstream.ignore(256, ':');
+ ipstream >> numdialogueboxes[whichdi];
+ for (int i = 0; i < numdialogueboxes[whichdi]; i++) {
+ ipstream.ignore(256, ':');
+ ipstream.ignore(256, ':');
+ ipstream.ignore(256, ' ');
+ ipstream >> dialogueboxlocation[whichdi][i];
+ ipstream.ignore(256, ':');
+ ipstream >> dialogueboxcolor[whichdi][i][0];
+ ipstream >> dialogueboxcolor[whichdi][i][1];
+ ipstream >> dialogueboxcolor[whichdi][i][2];
+ ipstream.ignore(256, ':');
+ ipstream.getline(dialoguename[whichdi][i], 64);
+ ipstream.ignore(256, ':');
+ ipstream.ignore(256, ' ');
+ ipstream.getline(dialoguetext[whichdi][i], 128);
+ for (int j = 0; j < 128; j++) {
+ if (dialoguetext[whichdi][i][j] == '\\')dialoguetext[whichdi][i][j] = '\n';
+ }
+ ipstream.ignore(256, ':');
+ ipstream >> dialogueboxsound[whichdi][i];
}
- ipstream.ignore(256,':');
- ipstream >> dialogueboxsound[whichdi][i];
- }
- ipstream.close();
+ ipstream.close();
}
static void ch_fixtype(const char *args)
{
- int dlg;
- sscanf(args, "%d", &dlg);
- dialoguetype[0] = dlg;
+ int dlg;
+ sscanf(args, "%d", &dlg);
+ dialoguetype[0] = dlg;
}
static void ch_fixrotation(const char *args)
{
- participantyaw[whichdialogue][participantfocus[whichdialogue][indialogue]]=player[participantfocus[whichdialogue][indialogue]].yaw;
+ participantyaw[whichdialogue][participantfocus[whichdialogue][indialogue]] = player[participantfocus[whichdialogue][indialogue]].yaw;
}
static void ch_ddialogue(const char *args)
{
- if (numdialogues)
- numdialogues--;
+ if (numdialogues)
+ numdialogues--;
}
static void ch_dhs(const char *args)
{
- if (numhotspots)
- numhotspots--;
+ if (numhotspots)
+ numhotspots--;
}
static void ch_immobile(const char *args)
{
- player[0].immobile = 1;
+ player[0].immobile = 1;
}
static void ch_allimmobile(const char *args)
{
- for (int i = 1; i < numplayers; i++)
- player[i].immobile = 1;
+ for (int i = 1; i < numplayers; i++)
+ player[i].immobile = 1;
}
static void ch_mobile(const char *args)
{
- player[0].immobile = 0;
+ player[0].immobile = 0;
}
static void ch_default(const char *args)
{
- player[0].armorhead=1;
- player[0].armorhigh=1;
- player[0].armorlow=1;
- player[0].protectionhead=1;
- player[0].protectionhigh=1;
- player[0].protectionlow=1;
- player[0].metalhead=1;
- player[0].metalhigh=1;
- player[0].metallow=1;
- player[0].power=1;
- player[0].speedmult=1;
- player[0].scale=1;
-
- if(player[0].creature==wolftype){
- player[0].proportionhead=1.1;
- player[0].proportionbody=1.1;
- player[0].proportionarms=1.1;
- player[0].proportionlegs=1.1;
- } else if(player[0].creature==rabbittype){
- player[0].proportionhead=1.2;
- player[0].proportionbody=1.05;
- player[0].proportionarms=1.00;
- player[0].proportionlegs=1.1;
- player[0].proportionlegs.y=1.05;
- }
-
- player[0].numclothes=0;
- player[0].skeleton.drawmodel.textureptr.load(
- creatureskin[player[0].creature][player[0].whichskin],1,
- &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-
- editoractive=typeactive;
- player[0].immobile=0;
+ player[0].armorhead = 1;
+ player[0].armorhigh = 1;
+ player[0].armorlow = 1;
+ player[0].protectionhead = 1;
+ player[0].protectionhigh = 1;
+ player[0].protectionlow = 1;
+ player[0].metalhead = 1;
+ player[0].metalhigh = 1;
+ player[0].metallow = 1;
+ player[0].power = 1;
+ player[0].speedmult = 1;
+ player[0].scale = 1;
+
+ if (player[0].creature == wolftype) {
+ player[0].proportionhead = 1.1;
+ player[0].proportionbody = 1.1;
+ player[0].proportionarms = 1.1;
+ player[0].proportionlegs = 1.1;
+ } else if (player[0].creature == rabbittype) {
+ player[0].proportionhead = 1.2;
+ player[0].proportionbody = 1.05;
+ player[0].proportionarms = 1.00;
+ player[0].proportionlegs = 1.1;
+ player[0].proportionlegs.y = 1.05;
+ }
+
+ player[0].numclothes = 0;
+ player[0].skeleton.drawmodel.textureptr.load(
+ creatureskin[player[0].creature][player[0].whichskin], 1,
+ &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
+
+ editoractive = typeactive;
+ player[0].immobile = 0;
}
static void ch_play(const char *args)
{
- int dlg;
- sscanf(args, "%d", &dlg);
- whichdialogue = dlg;
-
- if (whichdialogue >= numdialogues)
- return;
-
- for(int i=0;i<numdialogueboxes[whichdialogue];i++){
- player[participantfocus[whichdialogue][i]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][i]];
- player[participantfocus[whichdialogue][i]].yaw=participantyaw[whichdialogue][participantfocus[whichdialogue][i]];
- player[participantfocus[whichdialogue][i]].targetyaw=participantyaw[whichdialogue][participantfocus[whichdialogue][i]];
- player[participantfocus[whichdialogue][i]].velocity=0;
- player[participantfocus[whichdialogue][i]].animTarget=player[participantfocus[whichdialogue][i]].getIdle();
- player[participantfocus[whichdialogue][i]].frameTarget=0;
- }
-
- directing=0;
- indialogue=0;
-
- playdialogueboxsound();
+ int dlg;
+ sscanf(args, "%d", &dlg);
+ whichdialogue = dlg;
+
+ if (whichdialogue >= numdialogues)
+ return;
+
+ for (int i = 0; i < numdialogueboxes[whichdialogue]; i++) {
+ player[participantfocus[whichdialogue][i]].coords = participantlocation[whichdialogue][participantfocus[whichdialogue][i]];
+ player[participantfocus[whichdialogue][i]].yaw = participantyaw[whichdialogue][participantfocus[whichdialogue][i]];
+ player[participantfocus[whichdialogue][i]].targetyaw = participantyaw[whichdialogue][participantfocus[whichdialogue][i]];
+ player[participantfocus[whichdialogue][i]].velocity = 0;
+ player[participantfocus[whichdialogue][i]].animTarget = player[participantfocus[whichdialogue][i]].getIdle();
+ player[participantfocus[whichdialogue][i]].frameTarget = 0;
+ }
+
+ directing = 0;
+ indialogue = 0;
+
+ playdialogueboxsound();
}
static void ch_mapkilleveryone(const char *args)
{
- maptype = mapkilleveryone;
+ maptype = mapkilleveryone;
}
static void ch_mapkillmost(const char *args)
{
- maptype = mapkillmost;
+ maptype = mapkillmost;
}
static void ch_mapkillsomeone(const char *args)
{
- maptype = mapkillsomeone;
+ maptype = mapkillsomeone;
}
static void ch_mapgosomewhere(const char *args)
{
- maptype = mapgosomewhere;
+ maptype = mapgosomewhere;
}
static void ch_viewdistance(const char *args)
{
- viewdistance = atof(args)*100;
+ viewdistance = atof(args) * 100;
}
static void ch_fadestart(const char *args)
{
- fadestart = atof(args);
+ fadestart = atof(args);
}
static void ch_slomo(const char *args)
{
- slomospeed = atof(args);
- slomo = !slomo;
- slomodelay = 1000;
+ slomospeed = atof(args);
+ slomo = !slomo;
+ slomodelay = 1000;
}
static void ch_slofreq(const char *args)
{
- slomofreq = atof(args);
+ slomofreq = atof(args);
}
static void ch_skytint(const char *args)
{
- sscanf(args, "%f%f%f", &skyboxr, &skyboxg, &skyboxb);
+ sscanf(args, "%f%f%f", &skyboxr, &skyboxg, &skyboxb);
- skyboxlightr=skyboxr;
- skyboxlightg=skyboxg;
- skyboxlightb=skyboxb;
+ skyboxlightr = skyboxr;
+ skyboxlightg = skyboxg;
+ skyboxlightb = skyboxb;
- SetUpLighting();
+ SetUpLighting();
- terrain.DoShadows();
- objects.DoShadows();
+ terrain.DoShadows();
+ objects.DoShadows();
}
static void ch_skylight(const char *args)
{
- sscanf(args, "%f%f%f", &skyboxlightr, &skyboxlightg, &skyboxlightb);
+ sscanf(args, "%f%f%f", &skyboxlightr, &skyboxlightg, &skyboxlightb);
- SetUpLighting();
+ SetUpLighting();
- terrain.DoShadows();
- objects.DoShadows();
+ terrain.DoShadows();
+ objects.DoShadows();
}
static void ch_skybox(const char *args)
{
- skyboxtexture = !skyboxtexture;
+ skyboxtexture = !skyboxtexture;
- SetUpLighting();
+ SetUpLighting();
- terrain.DoShadows();
- objects.DoShadows();
+ terrain.DoShadows();
+ objects.DoShadows();
}
static void cmd_dispatch(const string cmd)
{
- int i, n_cmds = sizeof(cmd_names) / sizeof(cmd_names[0]);
-
- for (i = 0; i < n_cmds; i++)
- if (cmd.substr(0,cmd.find(' '))==string(cmd_names[i]))
- {
- cout << "|" << cmd.substr(cmd.find(' ')+1) << "|" << endl;
- cmd_handlers[i](cmd.substr(cmd.find(' ')+1).c_str());
- break;
- }
- emit_sound_np(i < n_cmds ? consolesuccesssound : consolefailsound);
+ int i, n_cmds = sizeof(cmd_names) / sizeof(cmd_names[0]);
+
+ for (i = 0; i < n_cmds; i++)
+ if (cmd.substr(0, cmd.find(' ')) == string(cmd_names[i])) {
+ cout << "|" << cmd.substr(cmd.find(' ') + 1) << "|" << endl;
+ cmd_handlers[i](cmd.substr(cmd.find(' ') + 1).c_str());
+ break;
+ }
+ emit_sound_np(i < n_cmds ? consolesuccesssound : consolefailsound);
}
/********************> Tick() <*****/
extern bool save_image(const char * fname);
void Screenshot (void)
{
- char temp[1024];
- time_t t = time(NULL);
- struct tm *tme = localtime(&t);
- sprintf(temp, "Screenshots/Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec);
-
- #if defined(_WIN32)
- mkdir("Screenshots");
- #else
- mkdir("Screenshots", S_IRWXU);
- #endif
-
- save_image(temp);
+ char temp[1024];
+ time_t t = time(NULL);
+ struct tm *tme = localtime(&t);
+ sprintf(temp, "Screenshots/Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec);
+
+#if defined(_WIN32)
+ mkdir("Screenshots");
+#else
+ mkdir("Screenshots", S_IRWXU);
+#endif
+
+ save_image(temp);
}
-void Game::SetUpLighting(){
- if(environment==snowyenvironment)
- light.setColors(.65,.65,.7,.4,.4,.44);
- if(environment==desertenvironment)
- light.setColors(.95,.95,.95,.4,.35,.3);
- if(environment==grassyenvironment)
- light.setColors(.95,.95,1,.4,.4,.44);
- if(!skyboxtexture)
- light.setColors(1,1,1,.4,.4,.4);
- float average;
- average=(skyboxlightr+skyboxlightg+skyboxlightb)/3;
- light.color[0]*=(skyboxlightr+average)/2;
- light.color[1]*=(skyboxlightg+average)/2;
- light.color[2]*=(skyboxlightb+average)/2;
- light.ambient[0]*=(skyboxlightr+average)/2;
- light.ambient[1]*=(skyboxlightg+average)/2;
- light.ambient[2]*=(skyboxlightb+average)/2;
+void Game::SetUpLighting()
+{
+ if (environment == snowyenvironment)
+ light.setColors(.65, .65, .7, .4, .4, .44);
+ if (environment == desertenvironment)
+ light.setColors(.95, .95, .95, .4, .35, .3);
+ if (environment == grassyenvironment)
+ light.setColors(.95, .95, 1, .4, .4, .44);
+ if (!skyboxtexture)
+ light.setColors(1, 1, 1, .4, .4, .4);
+ float average;
+ average = (skyboxlightr + skyboxlightg + skyboxlightb) / 3;
+ light.color[0] *= (skyboxlightr + average) / 2;
+ light.color[1] *= (skyboxlightg + average) / 2;
+ light.color[2] *= (skyboxlightb + average) / 2;
+ light.ambient[0] *= (skyboxlightr + average) / 2;
+ light.ambient[1] *= (skyboxlightg + average) / 2;
+ light.ambient[2] *= (skyboxlightb + average) / 2;
}
-int findPathDist(int start,int end){
- int smallestcount,count,connected;
- int last,last2,last3,last4;
- int closest;
-
- smallestcount=1000;
- for(int i=0;i<50;i++){
- count=0;
- last=start;
- last2=-1;
- last3=-1;
- last4=-1;
- while(last!=end&&count<30){
- closest=-1;
- for(int j=0;j<numpathpoints;j++){
- if(j!=last&&j!=last2&&j!=last3&&j!=last4)
- {
- connected=0;
- if(numpathpointconnect[j])
- for(int k=0;k<numpathpointconnect[j];k++){
- if(pathpointconnect[j][k]==last)connected=1;
- }
- if(!connected)
- if(numpathpointconnect[last])
- for(int k=0;k<numpathpointconnect[last];k++){
- if(pathpointconnect[last][k]==j)connected=1;
+int findPathDist(int start, int end)
+{
+ int smallestcount, count, connected;
+ int last, last2, last3, last4;
+ int closest;
+
+ smallestcount = 1000;
+ for (int i = 0; i < 50; i++) {
+ count = 0;
+ last = start;
+ last2 = -1;
+ last3 = -1;
+ last4 = -1;
+ while (last != end && count < 30) {
+ closest = -1;
+ for (int j = 0; j < numpathpoints; j++) {
+ if (j != last && j != last2 && j != last3 && j != last4) {
+ connected = 0;
+ if (numpathpointconnect[j])
+ for (int k = 0; k < numpathpointconnect[j]; k++) {
+ if (pathpointconnect[j][k] == last)connected = 1;
+ }
+ if (!connected)
+ if (numpathpointconnect[last])
+ for (int k = 0; k < numpathpointconnect[last]; k++) {
+ if (pathpointconnect[last][k] == j)connected = 1;
}
- if(connected)
- if(closest==-1||Random()%2==0){
- closest=j;
+ if (connected)
+ if (closest == -1 || Random() % 2 == 0) {
+ closest = j;
}
- }
- }
- last4=last3;
- last3=last2;
- last2=last;
- last=closest;
- count++;
- }
- if(count<smallestcount)smallestcount=count;
- }
- return smallestcount;
+ }
+ }
+ last4 = last3;
+ last3 = last2;
+ last2 = last;
+ last = closest;
+ count++;
+ }
+ if (count < smallestcount)smallestcount = count;
+ }
+ return smallestcount;
}
-int Game::checkcollide(XYZ startpoint,XYZ endpoint){
- static XYZ colpoint,colviewer,coltarget;
- static float minx,minz,maxx,maxz,miny,maxy;
-
- minx=min(startpoint.x,endpoint.x)-1;
- miny=min(startpoint.y,endpoint.y)-1;
- minz=min(startpoint.z,endpoint.z)-1;
- maxx=max(startpoint.x,endpoint.x)+1;
- maxy=max(startpoint.y,endpoint.y)+1;
- maxz=max(startpoint.z,endpoint.z)+1;
-
- for(int i=0;i<objects.numobjects;i++){
- if( objects.position[i].x>minx-objects.model[i].boundingsphereradius&&
- objects.position[i].x<maxx+objects.model[i].boundingsphereradius&&
- objects.position[i].y>miny-objects.model[i].boundingsphereradius&&
- objects.position[i].y<maxy+objects.model[i].boundingsphereradius&&
- objects.position[i].z>minz-objects.model[i].boundingsphereradius&&
- objects.position[i].z<maxz+objects.model[i].boundingsphereradius){
- if( objects.type[i]!=treeleavestype&&
- objects.type[i]!=bushtype&&
- objects.type[i]!=firetype){
- colviewer=startpoint;
- coltarget=endpoint;
- if(objects.model[i].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[i],&objects.yaw[i])!=-1)return i;
- }
- }
- }
-
- //if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
-
- return -1;
+int Game::checkcollide(XYZ startpoint, XYZ endpoint)
+{
+ static XYZ colpoint, colviewer, coltarget;
+ static float minx, minz, maxx, maxz, miny, maxy;
+
+ minx = min(startpoint.x, endpoint.x) - 1;
+ miny = min(startpoint.y, endpoint.y) - 1;
+ minz = min(startpoint.z, endpoint.z) - 1;
+ maxx = max(startpoint.x, endpoint.x) + 1;
+ maxy = max(startpoint.y, endpoint.y) + 1;
+ maxz = max(startpoint.z, endpoint.z) + 1;
+
+ for (int i = 0; i < objects.numobjects; i++) {
+ if ( objects.position[i].x > minx - objects.model[i].boundingsphereradius &&
+ objects.position[i].x < maxx + objects.model[i].boundingsphereradius &&
+ objects.position[i].y > miny - objects.model[i].boundingsphereradius &&
+ objects.position[i].y < maxy + objects.model[i].boundingsphereradius &&
+ objects.position[i].z > minz - objects.model[i].boundingsphereradius &&
+ objects.position[i].z < maxz + objects.model[i].boundingsphereradius) {
+ if ( objects.type[i] != treeleavestype &&
+ objects.type[i] != bushtype &&
+ objects.type[i] != firetype) {
+ colviewer = startpoint;
+ coltarget = endpoint;
+ if (objects.model[i].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[i], &objects.yaw[i]) != -1)return i;
+ }
+ }
+ }
+
+ //if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
+
+ return -1;
}
-int Game::checkcollide(XYZ startpoint,XYZ endpoint,int what){
- static XYZ colpoint,colviewer,coltarget;
- static float minx,minz,maxx,maxz,miny,maxy;
- static int i; //FIXME: see below
-
- minx=min(startpoint.x,endpoint.x)-1;
- miny=min(startpoint.y,endpoint.y)-1;
- minz=min(startpoint.z,endpoint.z)-1;
- maxx=max(startpoint.x,endpoint.x)+1;
- maxy=max(startpoint.y,endpoint.y)+1;
- maxz=max(startpoint.z,endpoint.z)+1;
-
- if(what!=1000){
- if( objects.position[what].x>minx-objects.model[what].boundingsphereradius&&
- objects.position[what].x<maxx+objects.model[what].boundingsphereradius&&
- objects.position[what].y>miny-objects.model[what].boundingsphereradius&&
- objects.position[what].y<maxy+objects.model[what].boundingsphereradius&&
- objects.position[what].z>minz-objects.model[what].boundingsphereradius&&
- objects.position[what].z<maxz+objects.model[what].boundingsphereradius){
- if( objects.type[what]!=treeleavestype&&
- objects.type[what]!=bushtype&&
- objects.type[what]!=firetype){
- colviewer=startpoint;
- coltarget=endpoint;
+int Game::checkcollide(XYZ startpoint, XYZ endpoint, int what)
+{
+ static XYZ colpoint, colviewer, coltarget;
+ static float minx, minz, maxx, maxz, miny, maxy;
+ static int i; //FIXME: see below
+
+ minx = min(startpoint.x, endpoint.x) - 1;
+ miny = min(startpoint.y, endpoint.y) - 1;
+ minz = min(startpoint.z, endpoint.z) - 1;
+ maxx = max(startpoint.x, endpoint.x) + 1;
+ maxy = max(startpoint.y, endpoint.y) + 1;
+ maxz = max(startpoint.z, endpoint.z) + 1;
+
+ if (what != 1000) {
+ if ( objects.position[what].x > minx - objects.model[what].boundingsphereradius &&
+ objects.position[what].x < maxx + objects.model[what].boundingsphereradius &&
+ objects.position[what].y > miny - objects.model[what].boundingsphereradius &&
+ objects.position[what].y < maxy + objects.model[what].boundingsphereradius &&
+ objects.position[what].z > minz - objects.model[what].boundingsphereradius &&
+ objects.position[what].z < maxz + objects.model[what].boundingsphereradius) {
+ if ( objects.type[what] != treeleavestype &&
+ objects.type[what] != bushtype &&
+ objects.type[what] != firetype) {
+ colviewer = startpoint;
+ coltarget = endpoint;
//FIXME: i/what
- if(objects.model[what].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[what],&objects.yaw[what])!=-1)return i;
- }
- }
- }
+ if (objects.model[what].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[what], &objects.yaw[what]) != -1)return i;
+ }
+ }
+ }
- if(what==1000)if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
+ if (what == 1000)if (terrain.lineTerrain(startpoint, endpoint, &colpoint) != -1)return 1000;
- return -1;
+ return -1;
}
void Setenvironment(int which)
{
- LOGFUNC;
+ LOGFUNC;
- LOG(" Setting environment...");
+ LOG(" Setting environment...");
- float temptexdetail;
- environment=which;
+ float temptexdetail;
+ environment = which;
- pause_sound(stream_snowtheme);
- pause_sound(stream_grasstheme);
- pause_sound(stream_deserttheme);
- pause_sound(stream_wind);
- pause_sound(stream_desertambient);
+ pause_sound(stream_snowtheme);
+ pause_sound(stream_grasstheme);
+ pause_sound(stream_deserttheme);
+ pause_sound(stream_wind);
+ pause_sound(stream_desertambient);
- if(environment==snowyenvironment){
- windvector=0;
- windvector.z=3;
- if(ambientsound)
- emit_stream_np(stream_wind);
+ if (environment == snowyenvironment) {
+ windvector = 0;
+ windvector.z = 3;
+ if (ambientsound)
+ emit_stream_np(stream_wind);
- objects.treetextureptr.load(":Data:Textures:snowtree.png",0,1);
- objects.bushtextureptr.load(":Data:Textures:bushsnow.png",0,1);
- objects.rocktextureptr.load(":Data:Textures:bouldersnow.jpg",1,0);
- objects.boxtextureptr.load(":Data:Textures:snowbox.jpg",1,0);
+ objects.treetextureptr.load(":Data:Textures:snowtree.png", 0, 1);
+ objects.bushtextureptr.load(":Data:Textures:bushsnow.png", 0, 1);
+ objects.rocktextureptr.load(":Data:Textures:bouldersnow.jpg", 1, 0);
+ objects.boxtextureptr.load(":Data:Textures:snowbox.jpg", 1, 0);
- footstepsound = footstepsn1;
- footstepsound2 = footstepsn2;
- footstepsound3 = footstepst1;
- footstepsound4 = footstepst2;
+ footstepsound = footstepsn1;
+ footstepsound2 = footstepsn2;
+ footstepsound3 = footstepst1;
+ footstepsound4 = footstepst2;
- terraintexture.load(":Data:Textures:snow.jpg",1,0);
- terraintexture2.load(":Data:Textures:rock.jpg",1,0);
+ terraintexture.load(":Data:Textures:snow.jpg", 1, 0);
+ terraintexture2.load(":Data:Textures:rock.jpg", 1, 0);
- //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
+ //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
- temptexdetail=texdetail;
- if(texdetail>1)texdetail=4;
- skybox->load( ":Data:Textures:Skybox(snow):Front.jpg",
- ":Data:Textures:Skybox(snow):Left.jpg",
- ":Data:Textures:Skybox(snow):Back.jpg",
- ":Data:Textures:Skybox(snow):Right.jpg",
- ":Data:Textures:Skybox(snow):Up.jpg",
- ":Data:Textures:Skybox(snow):Down.jpg");
+ temptexdetail = texdetail;
+ if (texdetail > 1)texdetail = 4;
+ skybox->load( ":Data:Textures:Skybox(snow):Front.jpg",
+ ":Data:Textures:Skybox(snow):Left.jpg",
+ ":Data:Textures:Skybox(snow):Back.jpg",
+ ":Data:Textures:Skybox(snow):Right.jpg",
+ ":Data:Textures:Skybox(snow):Up.jpg",
+ ":Data:Textures:Skybox(snow):Down.jpg");
- texdetail=temptexdetail;
- } else if(environment==desertenvironment){
- windvector=0;
- windvector.z=2;
- objects.treetextureptr.load(":Data:Textures:deserttree.png",0,1);
- objects.bushtextureptr.load(":Data:Textures:bushdesert.png",0,1);
- objects.rocktextureptr.load(":Data:Textures:boulderdesert.jpg",1,0);
- objects.boxtextureptr.load(":Data:Textures:desertbox.jpg",1,0);
+ texdetail = temptexdetail;
+ } else if (environment == desertenvironment) {
+ windvector = 0;
+ windvector.z = 2;
+ objects.treetextureptr.load(":Data:Textures:deserttree.png", 0, 1);
+ objects.bushtextureptr.load(":Data:Textures:bushdesert.png", 0, 1);
+ objects.rocktextureptr.load(":Data:Textures:boulderdesert.jpg", 1, 0);
+ objects.boxtextureptr.load(":Data:Textures:desertbox.jpg", 1, 0);
- if(ambientsound)
- emit_stream_np(stream_desertambient);
+ if (ambientsound)
+ emit_stream_np(stream_desertambient);
- footstepsound = footstepsn1;
- footstepsound2 = footstepsn2;
- footstepsound3 = footstepsn1;
- footstepsound4 = footstepsn2;
+ footstepsound = footstepsn1;
+ footstepsound2 = footstepsn2;
+ footstepsound3 = footstepsn1;
+ footstepsound4 = footstepsn2;
- terraintexture.load(":Data:Textures:sand.jpg",1,0);
- terraintexture2.load(":Data:Textures:sandslope.jpg",1,0);
+ terraintexture.load(":Data:Textures:sand.jpg", 1, 0);
+ terraintexture2.load(":Data:Textures:sandslope.jpg", 1, 0);
- //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
+ //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
- temptexdetail=texdetail;
- if(texdetail>1)texdetail=4;
- skybox->load( ":Data:Textures:Skybox(sand):Front.jpg",
- ":Data:Textures:Skybox(sand):Left.jpg",
- ":Data:Textures:Skybox(sand):Back.jpg",
- ":Data:Textures:Skybox(sand):Right.jpg",
- ":Data:Textures:Skybox(sand):Up.jpg",
- ":Data:Textures:Skybox(sand):Down.jpg");
+ temptexdetail = texdetail;
+ if (texdetail > 1)texdetail = 4;
+ skybox->load( ":Data:Textures:Skybox(sand):Front.jpg",
+ ":Data:Textures:Skybox(sand):Left.jpg",
+ ":Data:Textures:Skybox(sand):Back.jpg",
+ ":Data:Textures:Skybox(sand):Right.jpg",
+ ":Data:Textures:Skybox(sand):Up.jpg",
+ ":Data:Textures:Skybox(sand):Down.jpg");
- texdetail=temptexdetail;
- } else if(environment==grassyenvironment){
- windvector=0;
- windvector.z=2;
- objects.treetextureptr.load(":Data:Textures:tree.png",0,1);
- objects.bushtextureptr.load(":Data:Textures:bush.png",0,1);
- objects.rocktextureptr.load(":Data:Textures:boulder.jpg",1,0);
- objects.boxtextureptr.load(":Data:Textures:grassbox.jpg",1,0);
+ texdetail = temptexdetail;
+ } else if (environment == grassyenvironment) {
+ windvector = 0;
+ windvector.z = 2;
+ objects.treetextureptr.load(":Data:Textures:tree.png", 0, 1);
+ objects.bushtextureptr.load(":Data:Textures:bush.png", 0, 1);
+ objects.rocktextureptr.load(":Data:Textures:boulder.jpg", 1, 0);
+ objects.boxtextureptr.load(":Data:Textures:grassbox.jpg", 1, 0);
- if(ambientsound)
- emit_stream_np(stream_wind, 100.);
+ if (ambientsound)
+ emit_stream_np(stream_wind, 100.);
- footstepsound = footstepgr1;
- footstepsound2 = footstepgr2;
- footstepsound3 = footstepst1;
- footstepsound4 = footstepst2;
+ footstepsound = footstepgr1;
+ footstepsound2 = footstepgr2;
+ footstepsound3 = footstepst1;
+ footstepsound4 = footstepst2;
- terraintexture.load(":Data:Textures:grassdirt.jpg",1,0);
- terraintexture2.load(":Data:Textures:mossrock.jpg",1,0);
+ terraintexture.load(":Data:Textures:grassdirt.jpg", 1, 0);
+ terraintexture2.load(":Data:Textures:mossrock.jpg", 1, 0);
- //LoadTexture(":Data:Textures:detail.png",&terraintexture3,1);
+ //LoadTexture(":Data:Textures:detail.png",&terraintexture3,1);
- temptexdetail=texdetail;
- if(texdetail>1)texdetail=4;
- skybox->load( ":Data:Textures:Skybox(grass):Front.jpg",
- ":Data:Textures:Skybox(grass):Left.jpg",
- ":Data:Textures:Skybox(grass):Back.jpg",
- ":Data:Textures:Skybox(grass):Right.jpg",
- ":Data:Textures:Skybox(grass):Up.jpg",
- ":Data:Textures:Skybox(grass):Down.jpg");
+ temptexdetail = texdetail;
+ if (texdetail > 1)texdetail = 4;
+ skybox->load( ":Data:Textures:Skybox(grass):Front.jpg",
+ ":Data:Textures:Skybox(grass):Left.jpg",
+ ":Data:Textures:Skybox(grass):Back.jpg",
+ ":Data:Textures:Skybox(grass):Right.jpg",
+ ":Data:Textures:Skybox(grass):Up.jpg",
+ ":Data:Textures:Skybox(grass):Down.jpg");
- texdetail=temptexdetail;
- }
- temptexdetail=texdetail;
- texdetail=1;
- terrain.load(":Data:Textures:heightmap.png");
+ texdetail = temptexdetail;
+ }
+ temptexdetail = texdetail;
+ texdetail = 1;
+ terrain.load(":Data:Textures:heightmap.png");
- texdetail=temptexdetail;
+ texdetail = temptexdetail;
}
-void LoadCampaign() {
- if(!accountactive)
- return;
- ifstream ipstream(ConvertFileName((":Data:Campaigns:"+accountactive->getCurrentCampaign()+".txt").c_str()));
- ipstream.ignore(256,':');
- int numlevels;
- ipstream >> numlevels;
- campaignlevels.clear();
- for(int i=0;i<numlevels;i++) {
- CampaignLevel cl;
- ipstream >> cl;
- campaignlevels.push_back(cl);
- }
- ipstream.close();
-
- ifstream test(ConvertFileName((":Data:Textures:"+accountactive->getCurrentCampaign()+":World.png").c_str()));
- if(test.good()) {
- Mainmenuitems[7].load((":Data:Textures:"+accountactive->getCurrentCampaign()+":World.png").c_str(),0,0);
- } else {
- Mainmenuitems[7].load(":Data:Textures:World.png",0,0);
- }
-
- if(accountactive->getCampaignChoicesMade()==0) {
- accountactive->setCampaignScore(0);
- accountactive->resetFasttime();
- }
+void LoadCampaign()
+{
+ if (!accountactive)
+ return;
+ ifstream ipstream(ConvertFileName((":Data:Campaigns:" + accountactive->getCurrentCampaign() + ".txt").c_str()));
+ ipstream.ignore(256, ':');
+ int numlevels;
+ ipstream >> numlevels;
+ campaignlevels.clear();
+ for (int i = 0; i < numlevels; i++) {
+ CampaignLevel cl;
+ ipstream >> cl;
+ campaignlevels.push_back(cl);
+ }
+ ipstream.close();
+
+ ifstream test(ConvertFileName((":Data:Textures:" + accountactive->getCurrentCampaign() + ":World.png").c_str()));
+ if (test.good()) {
+ Mainmenuitems[7].load((":Data:Textures:" + accountactive->getCurrentCampaign() + ":World.png").c_str(), 0, 0);
+ } else {
+ Mainmenuitems[7].load(":Data:Textures:World.png", 0, 0);
+ }
+
+ if (accountactive->getCampaignChoicesMade() == 0) {
+ accountactive->setCampaignScore(0);
+ accountactive->resetFasttime();
+ }
}
-vector<string> ListCampaigns() {
- DIR *campaigns = opendir(ConvertFileName(":Data:Campaigns"));
- struct dirent *campaign = NULL;
- if(!campaigns) {
- perror("Problem while loading campaigns");
- cerr << "campaign folder was : " << ConvertFileName(":Data:Campaigns") << endl;
- exit(EXIT_FAILURE);
- }
- vector<string> campaignNames;
- while ((campaign = readdir(campaigns)) != NULL) {
- string name(campaign->d_name);
- if(name.length()<5)
- continue;
- if(!name.compare(name.length()-4,4,".txt")) {
- campaignNames.push_back(name.substr(0,name.length()-4));
- }
- }
- closedir(campaigns);
- return campaignNames;
+vector<string> ListCampaigns()
+{
+ DIR *campaigns = opendir(ConvertFileName(":Data:Campaigns"));
+ struct dirent *campaign = NULL;
+ if (!campaigns) {
+ perror("Problem while loading campaigns");
+ cerr << "campaign folder was : " << ConvertFileName(":Data:Campaigns") << endl;
+ exit(EXIT_FAILURE);
+ }
+ vector<string> campaignNames;
+ while ((campaign = readdir(campaigns)) != NULL) {
+ string name(campaign->d_name);
+ if (name.length() < 5)
+ continue;
+ if (!name.compare(name.length() - 4, 4, ".txt")) {
+ campaignNames.push_back(name.substr(0, name.length() - 4));
+ }
+ }
+ closedir(campaigns);
+ return campaignNames;
}
-void Loadlevel(int which) {
- stealthloading=0;
- whichlevel=which;
-
- if(which == -1) {
- tutoriallevel = -1;
- Loadlevel("tutorial");
- } else if(which >= 0 && which <= 15) {
- char buf[32];
- snprintf(buf, 32, "map%d", which + 1); // challenges
- Loadlevel(buf);
- } else
- Loadlevel("mapsave");
+void Loadlevel(int which)
+{
+ stealthloading = 0;
+ whichlevel = which;
+
+ if (which == -1) {
+ tutoriallevel = -1;
+ Loadlevel("tutorial");
+ } else if (which >= 0 && which <= 15) {
+ char buf[32];
+ snprintf(buf, 32, "map%d", which + 1); // challenges
+ Loadlevel(buf);
+ } else
+ Loadlevel("mapsave");
}
-void Loadlevel(const char *name) {
- int templength;
- float lamefloat;
- static const char *pfx = ":Data:Maps:";
- char *buf;
-
- float headprop,legprop,armprop,bodyprop;
-
- LOGFUNC;
-
- LOG(std::string("Loading level...") + name);
-
- if(!gameon)
- visibleloading=1;
- if(stealthloading)
- visibleloading=0;
- if(!stillloading)
- loadtime=0;
- gamestarted=1;
-
- numenvsounds=0;
-
- if(tutoriallevel!=-1)
- tutoriallevel=0;
- else
- tutoriallevel=1;
-
- if(tutoriallevel==1)
- tutorialstage=0;
- if(tutorialstage==0) {
- tutorialstagetime=0;
- tutorialmaxtime=1;
- }
- loadingstuff=1;
- pause_sound(whooshsound);
- pause_sound(stream_firesound);
-
- // Change the map filename into something that is os specific
- buf = (char*) alloca(strlen(pfx) + strlen(name) + 1);
- sprintf(buf, "%s%s", pfx, name);
- const char *FixedFN = ConvertFileName(buf);
-
- int mapvers;
- FILE *tfile;
- //~ char* buff=getcwd(NULL,0);
- //~ cout << buff << " " << FixedFN << endl;
- //~ free(buff);
- tfile=fopen( FixedFN, "rb" );
- if(tfile) {
- pause_sound(stream_firesound);
- scoreadded=0;
- windialogue=false;
- hostiletime=0;
- won=0;
-
- animation[bounceidleanim].Load((char *)"Idle",middleheight,neutral);
-
- numdialogues=0;
-
- for(int i=0;i<20;i++)
- dialoguegonethrough[i]=0;
-
- indialogue=-1;
- cameramode=0;
-
- damagedealt=0;
- damagetaken=0;
-
- if(accountactive)
- difficulty=accountactive->getDifficulty();
-
- numhotspots=0;
- currenthotspot=-1;
- bonustime=1;
-
- skyboxtexture=1;
- skyboxr=1;
- skyboxg=1;
- skyboxb=1;
-
- freeze=0;
- winfreeze=0;
-
- for(int i=0;i<100;i++)
- bonusnum[i]=0;
-
- numfalls=0;
- numflipfail=0;
- numseen=0;
- numstaffattack=0;
- numswordattack=0;
- numknifeattack=0;
- numunarmedattack=0;
- numescaped=0;
- numflipped=0;
- numwallflipped=0;
- numthrowkill=0;
- numafterkill=0;
- numreversals=0;
- numattacks=0;
- maxalarmed=0;
- numresponded=0;
-
- bonustotal=startbonustotal;
- bonus=0;
- gameon=1;
- changedelay=0;
- if(console){
- emit_sound_np(consolesuccesssound);
- freeze=0;
- console=false;
- }
-
- if(!stealthloading){
- terrain.numdecals=0;
- Sprite::deleteSprites();
- for(int i=0;i<objects.numobjects;i++)
- objects.model[i].numdecals=0;
-
- int j=objects.numobjects;
- for(int i=0;i<j;i++){
- objects.DeleteObject(0);
- if(visibleloading)
+void Loadlevel(const char *name)
+{
+ int templength;
+ float lamefloat;
+ static const char *pfx = ":Data:Maps:";
+ char *buf;
+
+ float headprop, legprop, armprop, bodyprop;
+
+ LOGFUNC;
+
+ LOG(std::string("Loading level...") + name);
+
+ if (!gameon)
+ visibleloading = 1;
+ if (stealthloading)
+ visibleloading = 0;
+ if (!stillloading)
+ loadtime = 0;
+ gamestarted = 1;
+
+ numenvsounds = 0;
+
+ if (tutoriallevel != -1)
+ tutoriallevel = 0;
+ else
+ tutoriallevel = 1;
+
+ if (tutoriallevel == 1)
+ tutorialstage = 0;
+ if (tutorialstage == 0) {
+ tutorialstagetime = 0;
+ tutorialmaxtime = 1;
+ }
+ loadingstuff = 1;
+ pause_sound(whooshsound);
+ pause_sound(stream_firesound);
+
+ // Change the map filename into something that is os specific
+ buf = (char*) alloca(strlen(pfx) + strlen(name) + 1);
+ sprintf(buf, "%s%s", pfx, name);
+ const char *FixedFN = ConvertFileName(buf);
+
+ int mapvers;
+ FILE *tfile;
+ //~ char* buff=getcwd(NULL,0);
+ //~ cout << buff << " " << FixedFN << endl;
+ //~ free(buff);
+ tfile = fopen( FixedFN, "rb" );
+ if (tfile) {
+ pause_sound(stream_firesound);
+ scoreadded = 0;
+ windialogue = false;
+ hostiletime = 0;
+ won = 0;
+
+ animation[bounceidleanim].Load((char *)"Idle", middleheight, neutral);
+
+ numdialogues = 0;
+
+ for (int i = 0; i < 20; i++)
+ dialoguegonethrough[i] = 0;
+
+ indialogue = -1;
+ cameramode = 0;
+
+ damagedealt = 0;
+ damagetaken = 0;
+
+ if (accountactive)
+ difficulty = accountactive->getDifficulty();
+
+ numhotspots = 0;
+ currenthotspot = -1;
+ bonustime = 1;
+
+ skyboxtexture = 1;
+ skyboxr = 1;
+ skyboxg = 1;
+ skyboxb = 1;
+
+ freeze = 0;
+ winfreeze = 0;
+
+ for (int i = 0; i < 100; i++)
+ bonusnum[i] = 0;
+
+ numfalls = 0;
+ numflipfail = 0;
+ numseen = 0;
+ numstaffattack = 0;
+ numswordattack = 0;
+ numknifeattack = 0;
+ numunarmedattack = 0;
+ numescaped = 0;
+ numflipped = 0;
+ numwallflipped = 0;
+ numthrowkill = 0;
+ numafterkill = 0;
+ numreversals = 0;
+ numattacks = 0;
+ maxalarmed = 0;
+ numresponded = 0;
+
+ bonustotal = startbonustotal;
+ bonus = 0;
+ gameon = 1;
+ changedelay = 0;
+ if (console) {
+ emit_sound_np(consolesuccesssound);
+ freeze = 0;
+ console = false;
+ }
+
+ if (!stealthloading) {
+ terrain.numdecals = 0;
+ Sprite::deleteSprites();
+ for (int i = 0; i < objects.numobjects; i++)
+ objects.model[i].numdecals = 0;
+
+ int j = objects.numobjects;
+ for (int i = 0; i < j; i++) {
+ objects.DeleteObject(0);
+ if (visibleloading)
LoadingScreen();
- }
+ }
- for(int i=0;i<subdivision;i++)
- for(int j=0;j<subdivision;j++)
- terrain.patchobjectnum[i][j]=0;
- if(visibleloading)
+ for (int i = 0; i < subdivision; i++)
+ for (int j = 0; j < subdivision; j++)
+ terrain.patchobjectnum[i][j] = 0;
+ if (visibleloading)
LoadingScreen();
- }
+ }
- weapons.clear();
+ weapons.clear();
- funpackf(tfile, "Bi", &mapvers);
- if(mapvers>=15)
+ funpackf(tfile, "Bi", &mapvers);
+ if (mapvers >= 15)
funpackf(tfile, "Bi", &indemo);
- else
- indemo=0;
- if(mapvers>=5)
+ else
+ indemo = 0;
+ if (mapvers >= 5)
funpackf(tfile, "Bi", &maptype);
- else
- maptype=mapkilleveryone;
- if(mapvers>=6)
+ else
+ maptype = mapkilleveryone;
+ if (mapvers >= 6)
funpackf(tfile, "Bi", &hostile);
- else
- hostile=1;
- if(mapvers>=4)
+ else
+ hostile = 1;
+ if (mapvers >= 4)
funpackf(tfile, "Bf Bf", &viewdistance, &fadestart);
- else{
- viewdistance=100;
- fadestart=.6;
- }
- if(mapvers>=2)
+ else {
+ viewdistance = 100;
+ fadestart = .6;
+ }
+ if (mapvers >= 2)
funpackf(tfile, "Bb Bf Bf Bf", &skyboxtexture, &skyboxr, &skyboxg, &skyboxb);
- else{
- skyboxtexture=1;
- skyboxr=1;
- skyboxg=1;
- skyboxb=1;
- }
- if(mapvers>=10)
+ else {
+ skyboxtexture = 1;
+ skyboxr = 1;
+ skyboxg = 1;
+ skyboxb = 1;
+ }
+ if (mapvers >= 10)
funpackf(tfile, "Bf Bf Bf", &skyboxlightr, &skyboxlightg, &skyboxlightb);
- else{
- skyboxlightr=skyboxr;
- skyboxlightg=skyboxg;
- skyboxlightb=skyboxb;
- }
- if(!stealthloading)
- funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &player[0].coords.x,&player[0].coords.y,&player[0].coords.z,&player[0].yaw,&player[0].targetyaw, &player[0].num_weapons);
- if(stealthloading)
- funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat,&lamefloat,&lamefloat,&lamefloat,&lamefloat, &player[0].num_weapons);
- player[0].originalcoords=player[0].coords;
- if(player[0].num_weapons>0&&player[0].num_weapons<5)
- for(int j=0;j<player[0].num_weapons;j++){
- player[0].weaponids[j]=weapons.size();
- int type;
- funpackf(tfile, "Bi", &type);
- weapons.push_back(Weapon(type,0));
- }
-
- if(visibleloading)
+ else {
+ skyboxlightr = skyboxr;
+ skyboxlightg = skyboxg;
+ skyboxlightb = skyboxb;
+ }
+ if (!stealthloading)
+ funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &player[0].coords.x, &player[0].coords.y, &player[0].coords.z, &player[0].yaw, &player[0].targetyaw, &player[0].num_weapons);
+ if (stealthloading)
+ funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat, &lamefloat, &lamefloat, &lamefloat, &lamefloat, &player[0].num_weapons);
+ player[0].originalcoords = player[0].coords;
+ if (player[0].num_weapons > 0 && player[0].num_weapons < 5)
+ for (int j = 0; j < player[0].num_weapons; j++) {
+ player[0].weaponids[j] = weapons.size();
+ int type;
+ funpackf(tfile, "Bi", &type);
+ weapons.push_back(Weapon(type, 0));
+ }
+
+ if (visibleloading)
LoadingScreen();
- funpackf(tfile, "Bf Bf Bf", &player[0].armorhead, &player[0].armorhigh, &player[0].armorlow);
- funpackf(tfile, "Bf Bf Bf", &player[0].protectionhead, &player[0].protectionhigh, &player[0].protectionlow);
- funpackf(tfile, "Bf Bf Bf", &player[0].metalhead, &player[0].metalhigh, &player[0].metallow);
- funpackf(tfile, "Bf Bf", &player[0].power, &player[0].speedmult);
+ funpackf(tfile, "Bf Bf Bf", &player[0].armorhead, &player[0].armorhigh, &player[0].armorlow);
+ funpackf(tfile, "Bf Bf Bf", &player[0].protectionhead, &player[0].protectionhigh, &player[0].protectionlow);
+ funpackf(tfile, "Bf Bf Bf", &player[0].metalhead, &player[0].metalhigh, &player[0].metallow);
+ funpackf(tfile, "Bf Bf", &player[0].power, &player[0].speedmult);
- funpackf(tfile, "Bi", &player[0].numclothes);
+ funpackf(tfile, "Bi", &player[0].numclothes);
- if(mapvers>=9)
- funpackf(tfile, "Bi Bi", &player[0].whichskin, &player[0].creature);
- else{
- player[0].whichskin=0;
- player[0].creature=rabbittype;
- }
+ if (mapvers >= 9)
+ funpackf(tfile, "Bi Bi", &player[0].whichskin, &player[0].creature);
+ else {
+ player[0].whichskin = 0;
+ player[0].creature = rabbittype;
+ }
- player[0].lastattack=-1;
- player[0].lastattack2=-1;
- player[0].lastattack3=-1;
+ player[0].lastattack = -1;
+ player[0].lastattack2 = -1;
+ player[0].lastattack3 = -1;
//dialogues
- if(mapvers>=8){
- funpackf(tfile, "Bi", &numdialogues);
- for(int k=0;k<numdialogues;k++){
+ if (mapvers >= 8) {
+ funpackf(tfile, "Bi", &numdialogues);
+ for (int k = 0; k < numdialogues; k++) {
funpackf(tfile, "Bi", &numdialogueboxes[k]);
funpackf(tfile, "Bi", &dialoguetype[k]);
- for(int l=0;l<10;l++){
+ for (int l = 0; l < 10; l++) {
funpackf(tfile, "Bf Bf Bf", &participantlocation[k][l].x, &participantlocation[k][l].y, &participantlocation[k][l].z);
funpackf(tfile, "Bf", &participantyaw[k][l]);
}
- for(int l=0;l<numdialogueboxes[k];l++){
+ for (int l = 0; l < numdialogueboxes[k]; l++) {
funpackf(tfile, "Bi", &dialogueboxlocation[k][l]);
funpackf(tfile, "Bf", &dialogueboxcolor[k][l][0]);
funpackf(tfile, "Bf", &dialogueboxcolor[k][l][1]);
funpackf(tfile, "Bf", &dialogueboxcolor[k][l][2]);
funpackf(tfile, "Bi", &dialogueboxsound[k][l]);
- funpackf(tfile, "Bi",&templength);
- if(templength>128||templength<=0)
- templength=128;
+ funpackf(tfile, "Bi", &templength);
+ if (templength > 128 || templength <= 0)
+ templength = 128;
int m;
- for(m=0;m<templength;m++){
+ for (m = 0; m < templength; m++) {
funpackf(tfile, "Bb", &dialoguetext[k][l][m]);
- if(dialoguetext[k][l][m]=='\0')
+ if (dialoguetext[k][l][m] == '\0')
break;
}
dialoguetext[k][l][m] = 0;
- funpackf(tfile, "Bi",&templength);
- if(templength>64||templength<=0)templength=64;
- for(m=0;m<templength;m++){
+ funpackf(tfile, "Bi", &templength);
+ if (templength > 64 || templength <= 0)templength = 64;
+ for (m = 0; m < templength; m++) {
funpackf(tfile, "Bb", &dialoguename[k][l][m]);
- if(dialoguename[k][l][m]=='\0')
+ if (dialoguename[k][l][m] == '\0')
break;
}
dialoguename[k][l][m] = 0;
funpackf(tfile, "Bi", &participantfocus[k][l]);
funpackf(tfile, "Bi", &participantaction[k][l]);
- for(m=0;m<10;m++)
+ for (m = 0; m < 10; m++)
funpackf(tfile, "Bf Bf Bf", &participantfacing[k][l][m].x, &participantfacing[k][l][m].y, &participantfacing[k][l][m].z);
- funpackf(tfile, "Bf Bf",&dialoguecamerayaw[k][l],&dialoguecamerapitch[k][l]);
+ funpackf(tfile, "Bf Bf", &dialoguecamerayaw[k][l], &dialoguecamerapitch[k][l]);
}
}
- }else
- numdialogues=0;
+ } else
+ numdialogues = 0;
- for(int k=0;k<player[0].numclothes;k++){
+ for (int k = 0; k < player[0].numclothes; k++) {
funpackf(tfile, "Bi", &templength);
- for(int l=0;l<templength;l++)
+ for (int l = 0; l < templength; l++)
funpackf(tfile, "Bb", &player[0].clothes[k][l]);
- player[0].clothes[k][templength]='\0';
+ player[0].clothes[k][templength] = '\0';
funpackf(tfile, "Bf Bf Bf", &player[0].clothestintr[k], &player[0].clothestintg[k], &player[0].clothestintb[k]);
}
- funpackf(tfile, "Bi", &environment);
+ funpackf(tfile, "Bi", &environment);
- funpackf(tfile, "Bi", &objects.numobjects);
- for(int i=0;i<objects.numobjects;i++){
- funpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", &objects.type[i],&objects.yaw[i],&objects.pitch[i], &objects.position[i].x, &objects.position[i].y, &objects.position[i].z,&objects.scale[i]);
- if(objects.type[i]==treeleavestype)
- objects.scale[i]=objects.scale[i-1];
+ funpackf(tfile, "Bi", &objects.numobjects);
+ for (int i = 0; i < objects.numobjects; i++) {
+ funpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", &objects.type[i], &objects.yaw[i], &objects.pitch[i], &objects.position[i].x, &objects.position[i].y, &objects.position[i].z, &objects.scale[i]);
+ if (objects.type[i] == treeleavestype)
+ objects.scale[i] = objects.scale[i - 1];
}
- if(mapvers>=7){
- funpackf(tfile, "Bi", &numhotspots);
- for(int i=0;i<numhotspots;i++){
- funpackf(tfile, "Bi Bf Bf Bf Bf", &hotspottype[i],&hotspotsize[i],&hotspot[i].x,&hotspot[i].y,&hotspot[i].z);
+ if (mapvers >= 7) {
+ funpackf(tfile, "Bi", &numhotspots);
+ for (int i = 0; i < numhotspots; i++) {
+ funpackf(tfile, "Bi Bf Bf Bf Bf", &hotspottype[i], &hotspotsize[i], &hotspot[i].x, &hotspot[i].y, &hotspot[i].z);
funpackf(tfile, "Bi", &templength);
- if(templength)
- for(int l=0;l<templength;l++)
+ if (templength)
+ for (int l = 0; l < templength; l++)
funpackf(tfile, "Bb", &hotspottext[i][l]);
- hotspottext[i][templength]='\0';
- if(hotspottype[i]==-111)
- indemo=1;
+ hotspottext[i][templength] = '\0';
+ if (hotspottype[i] == -111)
+ indemo = 1;
}
- }else
- numhotspots=0;
+ } else
+ numhotspots = 0;
- if(visibleloading)
+ if (visibleloading)
LoadingScreen();
- if(!stealthloading){
- objects.center=0;
- for(int i=0;i<objects.numobjects;i++)
- objects.center+=objects.position[i];
- objects.center/=objects.numobjects;
+ if (!stealthloading) {
+ objects.center = 0;
+ for (int i = 0; i < objects.numobjects; i++)
+ objects.center += objects.position[i];
+ objects.center /= objects.numobjects;
- if(visibleloading)
+ if (visibleloading)
LoadingScreen();
- float maxdistance=0;
- float tempdist;
- //~ int whichclosest;
- for(int i=0;i<objects.numobjects;i++){
- tempdist=distsq(&objects.center,&objects.position[i]);
- if(tempdist>maxdistance){
- //~ whichclosest=i;
- maxdistance=tempdist;
- }
- }
- objects.radius=fast_sqrt(maxdistance);
- }
-
- if(visibleloading)
+ float maxdistance = 0;
+ float tempdist;
+ //~ int whichclosest;
+ for (int i = 0; i < objects.numobjects; i++) {
+ tempdist = distsq(&objects.center, &objects.position[i]);
+ if (tempdist > maxdistance) {
+ //~ whichclosest=i;
+ maxdistance = tempdist;
+ }
+ }
+ objects.radius = fast_sqrt(maxdistance);
+ }
+
+ if (visibleloading)
LoadingScreen();
- //mapcenter=objects.center;
- //mapradius=objects.radius;
-
- funpackf(tfile, "Bi", &numplayers);
- int howmanyremoved=0;
- bool removeanother=0;
- if(numplayers>1&&numplayers<maxplayers){
- for(int i=1;i<numplayers;i++){
- if(visibleloading)
+ //mapcenter=objects.center;
+ //mapradius=objects.radius;
+
+ funpackf(tfile, "Bi", &numplayers);
+ int howmanyremoved = 0;
+ bool removeanother = 0;
+ if (numplayers > 1 && numplayers < maxplayers) {
+ for (int i = 1; i < numplayers; i++) {
+ if (visibleloading)
LoadingScreen();
- removeanother=0;
-
- funpackf(tfile, "Bi Bi Bf Bf Bf Bi",&player[i-howmanyremoved].whichskin,&player[i-howmanyremoved].creature, &player[i-howmanyremoved].coords.x,&player[i-howmanyremoved].coords.y,&player[i-howmanyremoved].coords.z,&player[i-howmanyremoved].num_weapons);
- if(mapvers>=5)
- funpackf(tfile, "Bi", &player[i-howmanyremoved].howactive);
- else
- player[i-howmanyremoved].howactive=typeactive;
- if(mapvers>=3)
- funpackf(tfile, "Bf",&player[i-howmanyremoved].scale);
- else
- player[i-howmanyremoved].scale=-1;
- if(mapvers>=11)
- funpackf(tfile, "Bb",&player[i-howmanyremoved].immobile);
- else
- player[i-howmanyremoved].immobile=0;
- if(mapvers>=12)
- funpackf(tfile, "Bf",&player[i-howmanyremoved].yaw);
- else
- player[i-howmanyremoved].yaw=0;
- player[i-howmanyremoved].targetyaw=player[i-howmanyremoved].yaw;
- if(player[i-howmanyremoved].num_weapons<0||player[i-howmanyremoved].num_weapons>5){
- removeanother=1;
- howmanyremoved++;
- }
- if(!removeanother){
- if(player[i-howmanyremoved].num_weapons>0&&player[i-howmanyremoved].num_weapons<5){
- for(int j=0;j<player[i-howmanyremoved].num_weapons;j++){
- player[i-howmanyremoved].weaponids[j]=weapons.size();
- int type;
- funpackf(tfile, "Bi", &type);
- weapons.push_back(Weapon(type,i));
- }
- }
- funpackf(tfile, "Bi", &player[i-howmanyremoved].numwaypoints);
- //player[i-howmanyremoved].numwaypoints=10;
- for(int j=0;j<player[i-howmanyremoved].numwaypoints;j++){
- funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].x);
- funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].y);
- funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].z);
- if(mapvers>=5)
- funpackf(tfile, "Bi", &player[i-howmanyremoved].waypointtype[j]);
- else
- player[i-howmanyremoved].waypointtype[j] = wpkeepwalking;
- }
-
- funpackf(tfile, "Bi", &player[i-howmanyremoved].waypoint);
- if(player[i-howmanyremoved].waypoint>player[i-howmanyremoved].numwaypoints-1)
- player[i-howmanyremoved].waypoint=0;
-
- funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].armorhead, &player[i-howmanyremoved].armorhigh, &player[i-howmanyremoved].armorlow);
- funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].protectionhead, &player[i-howmanyremoved].protectionhigh, &player[i-howmanyremoved].protectionlow);
- funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].metalhead, &player[i-howmanyremoved].metalhigh, &player[i-howmanyremoved].metallow);
- funpackf(tfile, "Bf Bf", &player[i-howmanyremoved].power, &player[i-howmanyremoved].speedmult);
-
- if(mapvers>=4)
+ removeanother = 0;
+
+ funpackf(tfile, "Bi Bi Bf Bf Bf Bi", &player[i - howmanyremoved].whichskin, &player[i - howmanyremoved].creature, &player[i - howmanyremoved].coords.x, &player[i - howmanyremoved].coords.y, &player[i - howmanyremoved].coords.z, &player[i - howmanyremoved].num_weapons);
+ if (mapvers >= 5)
+ funpackf(tfile, "Bi", &player[i - howmanyremoved].howactive);
+ else
+ player[i - howmanyremoved].howactive = typeactive;
+ if (mapvers >= 3)
+ funpackf(tfile, "Bf", &player[i - howmanyremoved].scale);
+ else
+ player[i - howmanyremoved].scale = -1;
+ if (mapvers >= 11)
+ funpackf(tfile, "Bb", &player[i - howmanyremoved].immobile);
+ else
+ player[i - howmanyremoved].immobile = 0;
+ if (mapvers >= 12)
+ funpackf(tfile, "Bf", &player[i - howmanyremoved].yaw);
+ else
+ player[i - howmanyremoved].yaw = 0;
+ player[i - howmanyremoved].targetyaw = player[i - howmanyremoved].yaw;
+ if (player[i - howmanyremoved].num_weapons < 0 || player[i - howmanyremoved].num_weapons > 5) {
+ removeanother = 1;
+ howmanyremoved++;
+ }
+ if (!removeanother) {
+ if (player[i - howmanyremoved].num_weapons > 0 && player[i - howmanyremoved].num_weapons < 5) {
+ for (int j = 0; j < player[i - howmanyremoved].num_weapons; j++) {
+ player[i - howmanyremoved].weaponids[j] = weapons.size();
+ int type;
+ funpackf(tfile, "Bi", &type);
+ weapons.push_back(Weapon(type, i));
+ }
+ }
+ funpackf(tfile, "Bi", &player[i - howmanyremoved].numwaypoints);
+ //player[i-howmanyremoved].numwaypoints=10;
+ for (int j = 0; j < player[i - howmanyremoved].numwaypoints; j++) {
+ funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].x);
+ funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].y);
+ funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].z);
+ if (mapvers >= 5)
+ funpackf(tfile, "Bi", &player[i - howmanyremoved].waypointtype[j]);
+ else
+ player[i - howmanyremoved].waypointtype[j] = wpkeepwalking;
+ }
+
+ funpackf(tfile, "Bi", &player[i - howmanyremoved].waypoint);
+ if (player[i - howmanyremoved].waypoint > player[i - howmanyremoved].numwaypoints - 1)
+ player[i - howmanyremoved].waypoint = 0;
+
+ funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].armorhead, &player[i - howmanyremoved].armorhigh, &player[i - howmanyremoved].armorlow);
+ funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].protectionhead, &player[i - howmanyremoved].protectionhigh, &player[i - howmanyremoved].protectionlow);
+ funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].metalhead, &player[i - howmanyremoved].metalhigh, &player[i - howmanyremoved].metallow);
+ funpackf(tfile, "Bf Bf", &player[i - howmanyremoved].power, &player[i - howmanyremoved].speedmult);
+
+ if (mapvers >= 4)
funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop);
- else{
- headprop=1;
- bodyprop=1;
- armprop=1;
- legprop=1;
- }
- if(player[i-howmanyremoved].creature==wolftype){
- player[i-howmanyremoved].proportionhead=1.1*headprop;
- player[i-howmanyremoved].proportionbody=1.1*bodyprop;
- player[i-howmanyremoved].proportionarms=1.1*armprop;
- player[i-howmanyremoved].proportionlegs=1.1*legprop;
- }
-
- if(player[i-howmanyremoved].creature==rabbittype){
- player[i-howmanyremoved].proportionhead=1.2*headprop;
- player[i-howmanyremoved].proportionbody=1.05*bodyprop;
- player[i-howmanyremoved].proportionarms=1.00*armprop;
- player[i-howmanyremoved].proportionlegs=1.1*legprop;
- player[i-howmanyremoved].proportionlegs.y=1.05*legprop;
- }
-
- funpackf(tfile, "Bi", &player[i-howmanyremoved].numclothes);
- if(player[i-howmanyremoved].numclothes){
- for(int k=0;k<player[i-howmanyremoved].numclothes;k++){
- int templength;
- funpackf(tfile, "Bi", &templength);
- for(int l=0;l<templength;l++)
- funpackf(tfile, "Bb", &player[i-howmanyremoved].clothes[k][l]);
- player[i-howmanyremoved].clothes[k][templength]='\0';
- funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].clothestintr[k], &player[i-howmanyremoved].clothestintg[k], &player[i-howmanyremoved].clothestintb[k]);
- }
- }
- }
- }
- }
- if(visibleloading)
+ else {
+ headprop = 1;
+ bodyprop = 1;
+ armprop = 1;
+ legprop = 1;
+ }
+ if (player[i - howmanyremoved].creature == wolftype) {
+ player[i - howmanyremoved].proportionhead = 1.1 * headprop;
+ player[i - howmanyremoved].proportionbody = 1.1 * bodyprop;
+ player[i - howmanyremoved].proportionarms = 1.1 * armprop;
+ player[i - howmanyremoved].proportionlegs = 1.1 * legprop;
+ }
+
+ if (player[i - howmanyremoved].creature == rabbittype) {
+ player[i - howmanyremoved].proportionhead = 1.2 * headprop;
+ player[i - howmanyremoved].proportionbody = 1.05 * bodyprop;
+ player[i - howmanyremoved].proportionarms = 1.00 * armprop;
+ player[i - howmanyremoved].proportionlegs = 1.1 * legprop;
+ player[i - howmanyremoved].proportionlegs.y = 1.05 * legprop;
+ }
+
+ funpackf(tfile, "Bi", &player[i - howmanyremoved].numclothes);
+ if (player[i - howmanyremoved].numclothes) {
+ for (int k = 0; k < player[i - howmanyremoved].numclothes; k++) {
+ int templength;
+ funpackf(tfile, "Bi", &templength);
+ for (int l = 0; l < templength; l++)
+ funpackf(tfile, "Bb", &player[i - howmanyremoved].clothes[k][l]);
+ player[i - howmanyremoved].clothes[k][templength] = '\0';
+ funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].clothestintr[k], &player[i - howmanyremoved].clothestintg[k], &player[i - howmanyremoved].clothestintb[k]);
+ }
+ }
+ }
+ }
+ }
+ if (visibleloading)
LoadingScreen();
- numplayers-=howmanyremoved;
- funpackf(tfile, "Bi", &numpathpoints);
- if(numpathpoints>30||numpathpoints<0)
- numpathpoints=0;
- for(int j=0;j<numpathpoints;j++){
- funpackf(tfile, "Bf Bf Bf Bi", &pathpoint[j].x,&pathpoint[j].y,&pathpoint[j].z,&numpathpointconnect[j]);
- for(int k=0;k<numpathpointconnect[j];k++){
+ numplayers -= howmanyremoved;
+ funpackf(tfile, "Bi", &numpathpoints);
+ if (numpathpoints > 30 || numpathpoints < 0)
+ numpathpoints = 0;
+ for (int j = 0; j < numpathpoints; j++) {
+ funpackf(tfile, "Bf Bf Bf Bi", &pathpoint[j].x, &pathpoint[j].y, &pathpoint[j].z, &numpathpointconnect[j]);
+ for (int k = 0; k < numpathpointconnect[j]; k++) {
funpackf(tfile, "Bi", &pathpointconnect[j][k]);
}
}
- if(visibleloading)
+ if (visibleloading)
LoadingScreen();
- funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x,&mapcenter.y,&mapcenter.z,&mapradius);
+ funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x, &mapcenter.y, &mapcenter.z, &mapradius);
- SetUpLighting();
- if(environment!=oldenvironment)
+ SetUpLighting();
+ if (environment != oldenvironment)
Setenvironment(environment);
- oldenvironment=environment;
-
- if(!stealthloading){
- int j=objects.numobjects;
- objects.numobjects=0;
- for(int i=0;i<j;i++){
- objects.MakeObject(objects.type[i],objects.position[i],objects.yaw[i],objects.pitch[i],objects.scale[i]);
- if(visibleloading)
+ oldenvironment = environment;
+
+ if (!stealthloading) {
+ int j = objects.numobjects;
+ objects.numobjects = 0;
+ for (int i = 0; i < j; i++) {
+ objects.MakeObject(objects.type[i], objects.position[i], objects.yaw[i], objects.pitch[i], objects.scale[i]);
+ if (visibleloading)
LoadingScreen();
- }
+ }
- terrain.DoShadows();
- if(visibleloading)
+ terrain.DoShadows();
+ if (visibleloading)
LoadingScreen();
- objects.DoShadows();
- if(visibleloading)
+ objects.DoShadows();
+ if (visibleloading)
LoadingScreen();
- }
+ }
- fclose(tfile);
+ fclose(tfile);
- if(numplayers>maxplayers-1)
- numplayers=maxplayers-1;
- for(int i=0;i<numplayers;i++){
- if(visibleloading)
+ if (numplayers > maxplayers - 1)
+ numplayers = maxplayers - 1;
+ for (int i = 0; i < numplayers; i++) {
+ if (visibleloading)
LoadingScreen();
- player[i].burnt=0;
- player[i].bled=0;
- player[i].onfire=0;
- if(i==0||player[i].scale<0)
- player[i].scale=.2;
- player[i].skeleton.free=0;
- player[i].skeleton.id=i;
- if(i==0&&mapvers<9)
- player[i].creature=rabbittype;
- if(player[i].creature!=wolftype){
+ player[i].burnt = 0;
+ player[i].bled = 0;
+ player[i].onfire = 0;
+ if (i == 0 || player[i].scale < 0)
+ player[i].scale = .2;
+ player[i].skeleton.free = 0;
+ player[i].skeleton.id = i;
+ if (i == 0 && mapvers < 9)
+ player[i].creature = rabbittype;
+ if (player[i].creature != wolftype) {
player[i].skeleton.Load(
(char *)":Data:Skeleton:Basic Figure",
(char *)":Data:Skeleton:Basic Figurelow",
(char *)":Data:Models:Body6.solid",
(char *)":Data:Models:Body7.solid",
(char *)":Data:Models:Bodylow.solid",
- (char *)":Data:Models:Belt.solid",0);
- }else{
- if(player[i].creature!=wolftype){
- player[i].skeleton.Load(
- (char *)":Data:Skeleton:Basic Figure",
- (char *)":Data:Skeleton:Basic Figurelow",
- (char *)":Data:Skeleton:Rabbitbelt",
- (char *)":Data:Models:Body.solid",
- (char *)":Data:Models:Body2.solid",
- (char *)":Data:Models:Body3.solid",
- (char *)":Data:Models:Body4.solid",
- (char *)":Data:Models:Body5.solid",
- (char *)":Data:Models:Body6.solid",
- (char *)":Data:Models:Body7.solid",
- (char *)":Data:Models:Bodylow.solid",
- (char *)":Data:Models:Belt.solid",1);
- player[i].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png",1,1);
- }
- if(player[i].creature==wolftype){
- player[i].skeleton.Load(
- (char *)":Data:Skeleton:Basic Figure Wolf",
- (char *)":Data:Skeleton:Basic Figure Wolf Low",
- (char *)":Data:Skeleton:Rabbitbelt",
- (char *)":Data:Models:Wolf.solid",
- (char *)":Data:Models:Wolf2.solid",
- (char *)":Data:Models:Wolf3.solid",
- (char *)":Data:Models:Wolf4.solid",
- (char *)":Data:Models:Wolf5.solid",
- (char *)":Data:Models:Wolf6.solid",
- (char *)":Data:Models:Wolf7.solid",
- (char *)":Data:Models:Wolflow.solid",
- (char *)":Data:Models:Belt.solid",0);
- }
- }
-
-
- //~ int texsize;
- //~ texsize=512*512*3/texdetail/texdetail;
-
- player[i].skeleton.drawmodel.textureptr.load(creatureskin[player[i].creature][player[i].whichskin],1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
-
- if(player[i].numclothes){
- for(int j=0;j<player[i].numclothes;j++){
- tintr=player[i].clothestintr[j];
- tintg=player[i].clothestintg[j];
- tintb=player[i].clothestintb[j];
- AddClothes((char *)player[i].clothes[j],&player[i].skeleton.skinText[0]);
- }
- player[i].DoMipmaps();
- }
-
- player[i].animCurrent=bounceidleanim;
- player[i].animTarget=bounceidleanim;
- player[i].frameCurrent=0;
- player[i].frameTarget=1;
- player[i].target=0;
- player[i].speed=1+(float)(Random()%100)/1000;
- if(difficulty==0)
- player[i].speed-=.2;
- if(difficulty==1)
- player[i].speed-=.1;
-
- player[i].velocity=0;
- player[i].oldcoords=player[i].coords;
- player[i].realoldcoords=player[i].coords;
-
- player[i].id=i;
- player[i].skeleton.id=i;
- player[i].updatedelay=0;
- player[i].normalsupdatedelay=0;
-
- player[i].aitype=passivetype;
- player[i].madskills=0;
-
- if(i==0){
- player[i].proportionhead=1.2;
- player[i].proportionbody=1.05;
- player[i].proportionarms=1.00;
- player[i].proportionlegs=1.1;
- player[i].proportionlegs.y=1.05;
- }
- player[i].headless=0;
- player[i].currentoffset=0;
- player[i].targetoffset=0;
-
- player[i].damagetolerance=200;
-
- if(player[i].creature==wolftype){
- if(i==0||player[i].scale<0)
- player[i].scale=.23;
- player[i].damagetolerance=300;
- }
-
- if(visibleloading)
- LoadingScreen();
- if(cellophane){
- player[i].proportionhead.z=0;
- player[i].proportionbody.z=0;
- player[i].proportionarms.z=0;
- player[i].proportionlegs.z=0;
- }
-
- player[i].tempanimation.Load((char *)"Tempanim",0,0);
-
- player[i].headmorphness=0;
- player[i].targetheadmorphness=1;
- player[i].headmorphstart=0;
- player[i].headmorphend=0;
-
- player[i].pausetime=0;
-
- player[i].dead=0;
- player[i].jumppower=5;
- player[i].damage=0;
- player[i].permanentdamage=0;
- player[i].superpermanentdamage=0;
-
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].crouchkeydown=0;
- player[i].throwkeydown=0;
-
- player[i].collided=-10;
- player[i].loaded=1;
- player[i].bloodloss=0;
- player[i].weaponactive=-1;
- player[i].weaponstuck=-1;
- player[i].bleeding=0;
- player[i].deathbleeding=0;
- player[i].stunned=0;
- player[i].hasvictim=0;
- player[i].wentforweapon=0;
- }
-
- player[0].aitype=playercontrolled;
- player[0].weaponactive=-1;
-
- if(difficulty==1)
- player[0].power=1/.9;
-
- if(difficulty==0)
- player[0].power=1/.8;
-
- if(difficulty==1)
- player[0].damagetolerance=250;
- if(difficulty==0)
- player[0].damagetolerance=300;
- if(difficulty==0)
- player[0].armorhead*=1.5;
- if(difficulty==0)
- player[0].armorhigh*=1.5;
- if(difficulty==0)
- player[0].armorlow*=1.5;
- cameraloc=player[0].coords;
- cameraloc.y+=5;
- yaw=player[0].yaw;
-
- hawkcoords=player[0].coords;
- hawkcoords.y+=30;
-
- if(visibleloading)
- LoadingScreen();
- //~ for(int i=0;i<weapons.size();i++){
- //~ }
-
- LOG("Starting background music...");
-
- OPENAL_StopSound(OPENAL_ALL);
- if(environment==snowyenvironment){
- if(ambientsound)
- emit_stream_np(stream_wind);
- }else if(environment==desertenvironment){
- if(ambientsound)
- emit_stream_np(stream_desertambient);
- }else if(environment==grassyenvironment){
- if(ambientsound)
- emit_stream_np(stream_wind, 100.);
- }
- oldmusicvolume[0]=0;
- oldmusicvolume[1]=0;
- oldmusicvolume[2]=0;
- oldmusicvolume[3]=0;
-
- if(!firstload)
- firstload=1;
- } else {
- perror("Problem");
- }
- leveltime=0;
- loadingstuff=0;
- visibleloading=0;
-}
-
-void doTutorial(){
- if(tutorialstagetime>tutorialmaxtime){
- tutorialstage++;
- tutorialsuccess=0;
- if(tutorialstage<=1){
- canattack=0;
- cananger=0;
- reversaltrain=0;
- }
- switch(tutorialstage){
- case 1:
- tutorialmaxtime=5;
- break; case 2:
- tutorialmaxtime=2;
- break; case 3:
- tutorialmaxtime=600;
- break; case 4:
- tutorialmaxtime=1000;
- break; case 5:
- tutorialmaxtime=600;
- break; case 6:
- tutorialmaxtime=600;
- break; case 7:
- tutorialmaxtime=600;
- break; case 8:
- tutorialmaxtime=600;
- break; case 9:
- tutorialmaxtime=600;
- break; case 10:
- tutorialmaxtime=2;
- break; case 11:
- tutorialmaxtime=1000;
- break; case 12:
- tutorialmaxtime=1000;
- break; case 13:
- tutorialmaxtime=2;
- break; case 14: {
- tutorialmaxtime=3;
-
- XYZ temp,temp2;
-
- temp.x=1011;
- temp.y=84;
- temp.z=491;
- temp2.x=1025;
- temp2.y=75;
- temp2.z=447;
-
- player[1].coords=(temp+temp2)/2;
-
- emit_sound_at(fireendsound, player[1].coords);
-
- for(int i=0;i<player[1].skeleton.num_joints;i++){
- if(Random()%2==0){
- if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
- if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
- if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].yaw,0)*player[1].scale+player[1].coords;
- if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
- Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
- }
- }
- }
- break; case 15:
- tutorialmaxtime=500;
- break; case 16:
- tutorialmaxtime=500;
- break; case 17:
- tutorialmaxtime=500;
- break; case 18:
- tutorialmaxtime=500;
- break; case 19:
- tutorialstage=20;
- //tutorialmaxtime=500;
- break; case 20:
- tutorialmaxtime=500;
- break; case 21:
- tutorialmaxtime=500;
- if(bonus==cannon){
- bonus=Slicebonus;
- againbonus=1;
+ (char *)":Data:Models:Belt.solid", 0);
+ } else {
+ if (player[i].creature != wolftype) {
+ player[i].skeleton.Load(
+ (char *)":Data:Skeleton:Basic Figure",
+ (char *)":Data:Skeleton:Basic Figurelow",
+ (char *)":Data:Skeleton:Rabbitbelt",
+ (char *)":Data:Models:Body.solid",
+ (char *)":Data:Models:Body2.solid",
+ (char *)":Data:Models:Body3.solid",
+ (char *)":Data:Models:Body4.solid",
+ (char *)":Data:Models:Body5.solid",
+ (char *)":Data:Models:Body6.solid",
+ (char *)":Data:Models:Body7.solid",
+ (char *)":Data:Models:Bodylow.solid",
+ (char *)":Data:Models:Belt.solid", 1);
+ player[i].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png", 1, 1);
}
- else againbonus=0;
- break; case 22:
- tutorialmaxtime=500;
- break; case 23:
- tutorialmaxtime=500;
- break; case 24:
- tutorialmaxtime=500;
- break; case 25:
- tutorialmaxtime=500;
- break; case 26:
- tutorialmaxtime=2;
- break; case 27:
- tutorialmaxtime=4;
- reversaltrain=1;
- cananger=1;
- player[1].aitype=attacktypecutoff;
- break; case 28:
- tutorialmaxtime=400;
- break; case 29:
- tutorialmaxtime=400;
- player[0].escapednum=0;
- break; case 30:
- tutorialmaxtime=4;
- reversaltrain=0;
- cananger=0;
- player[1].aitype=passivetype;
- break; case 31:
- tutorialmaxtime=13;
- break; case 32:
- tutorialmaxtime=8;
- break; case 33:
- tutorialmaxtime=400;
- cananger=1;
- canattack=1;
- player[1].aitype=attacktypecutoff;
- break; case 34:
- tutorialmaxtime=400;
- break; case 35:
- tutorialmaxtime=400;
- break; case 36:
- tutorialmaxtime=2;
- reversaltrain=0;
- cananger=0;
- player[1].aitype=passivetype;
- break; case 37:
- damagedealt=0;
- damagetaken=0;
- tutorialmaxtime=50;
- cananger=1;
- canattack=1;
- player[1].aitype=attacktypecutoff;
- break; case 38:
- tutorialmaxtime=4;
- canattack=0;
- cananger=0;
- player[1].aitype=passivetype;
- break; case 39: {
- XYZ temp,temp2;
-
- temp.x=1011;
- temp.y=84;
- temp.z=491;
- temp2.x=1025;
- temp2.y=75;
- temp2.z=447;
-
- Weapon w(knife,-1);
- w.position=(temp+temp2)/2;
- w.tippoint=(temp+temp2)/2;
-
- w.velocity=0.1;
- w.tipvelocity=0.1;
- w.missed=1;
- w.hitsomething=0;
- w.freetime=0;
- w.firstfree=1;
- w.physics=1;
-
- weapons.push_back(w);
- }
- break; case 40:
- tutorialmaxtime=300;
- break; case 41:
- tutorialmaxtime=300;
- break; case 42:
- tutorialmaxtime=8;
- break; case 43:
- tutorialmaxtime=300;
- break; case 44:
- weapons[0].owner=1;
- player[0].weaponactive=-1;
- player[0].num_weapons=0;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- cananger=1;
- canattack=1;
- player[1].aitype=attacktypecutoff;
-
- tutorialmaxtime=300;
- break; case 45:
- weapons[0].owner=1;
- player[0].weaponactive=-1;
- player[0].num_weapons=0;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- tutorialmaxtime=300;
- break; case 46:
- weapons[0].owner=1;
- player[0].weaponactive=-1;
- player[0].num_weapons=0;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- weapons[0].setType(sword);
-
- tutorialmaxtime=300;
- break; case 47: {
- tutorialmaxtime=10;
-
- XYZ temp,temp2;
-
- temp.x=1011;
- temp.y=84;
- temp.z=491;
- temp2.x=1025;
- temp2.y=75;
- temp2.z=447;
-
- Weapon w(sword,-1);
- w.position=(temp+temp2)/2;
- w.tippoint=(temp+temp2)/2;
-
- w.velocity=0.1;
- w.tipvelocity=0.1;
- w.missed=1;
- w.hitsomething=0;
- w.freetime=0;
- w.firstfree=1;
- w.physics=1;
-
- weapons.push_back(w);
-
- weapons[0].owner=1;
- weapons[1].owner=0;
- player[0].weaponactive=0;
- player[0].num_weapons=1;
- player[0].weaponids[0]=1;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- }
- break; case 48:
- canattack=0;
- cananger=0;
- player[1].aitype=passivetype;
-
- tutorialmaxtime=15;
-
- weapons[0].owner=1;
- weapons[1].owner=0;
- player[0].weaponactive=0;
- player[0].num_weapons=1;
- player[0].weaponids[0]=1;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- if(player[0].weaponactive!=-1)
- weapons[player[0].weaponids[player[0].weaponactive]].setType(staff);
- else
- weapons[0].setType(staff);
- break; case 49:
- canattack=0;
- cananger=0;
- player[1].aitype=passivetype;
-
- tutorialmaxtime=200;
-
- weapons[1].position=1000;
- weapons[1].tippoint=1000;
-
- weapons[0].setType(knife);
-
- weapons[0].owner=0;
- player[1].weaponactive=-1;
- player[1].num_weapons=0;
- player[0].weaponactive=0;
- player[0].num_weapons=1;
- player[0].weaponids[0]=0;
-
- break; case 50: {
- tutorialmaxtime=8;
-
- XYZ temp,temp2;
- emit_sound_at(fireendsound, player[1].coords);
-
- for(int i=0;i<player[1].skeleton.num_joints;i++){
- if(Random()%2==0){
- if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
- if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
- if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].yaw,0)*player[1].scale+player[1].coords;
- if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
- Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
- }
+ if (player[i].creature == wolftype) {
+ player[i].skeleton.Load(
+ (char *)":Data:Skeleton:Basic Figure Wolf",
+ (char *)":Data:Skeleton:Basic Figure Wolf Low",
+ (char *)":Data:Skeleton:Rabbitbelt",
+ (char *)":Data:Models:Wolf.solid",
+ (char *)":Data:Models:Wolf2.solid",
+ (char *)":Data:Models:Wolf3.solid",
+ (char *)":Data:Models:Wolf4.solid",
+ (char *)":Data:Models:Wolf5.solid",
+ (char *)":Data:Models:Wolf6.solid",
+ (char *)":Data:Models:Wolf7.solid",
+ (char *)":Data:Models:Wolflow.solid",
+ (char *)":Data:Models:Belt.solid", 0);
}
-
- player[1].num_weapons=0;
- player[1].weaponstuck=-1;
- player[1].weaponactive=-1;
-
- weapons.clear();
}
- break; case 51:
- tutorialmaxtime=80000;
- break; default: break;
- }
- if(tutorialstage<=51)tutorialstagetime=0;
- }
-
- //Tutorial success
- if(tutorialstagetime<tutorialmaxtime-3){
- switch(tutorialstage){
- case 3: if(deltah||deltav)tutorialsuccess+=multiplier;
- break; case 4: if(player[0].forwardkeydown||player[0].backkeydown||player[0].leftkeydown||player[0].rightkeydown)tutorialsuccess+=multiplier;
- break; case 5: if(player[0].jumpkeydown)tutorialsuccess=1;
- break; case 6: if(player[0].isCrouch())tutorialsuccess=1;
- break; case 7: if(player[0].animTarget==rollanim)tutorialsuccess=1;
- break; case 8: if(player[0].animTarget==sneakanim)tutorialsuccess+=multiplier;
- break; case 9: if(player[0].animTarget==rabbitrunninganim||player[0].animTarget==wolfrunninganim)tutorialsuccess+=multiplier;
- break; case 11: if(player[0].isWallJump())tutorialsuccess=1;
- break; case 12: if(player[0].animTarget==flipanim)tutorialsuccess=1;
- break; case 15: if(player[0].animTarget==upunchanim||player[0].animTarget==winduppunchanim)tutorialsuccess=1;
- break; case 16: if(player[0].animTarget==winduppunchanim)tutorialsuccess=1;
- break; case 17: if(player[0].animTarget==spinkickanim)tutorialsuccess=1;
- break; case 18: if(player[0].animTarget==sweepanim)tutorialsuccess=1;
- break; case 19: if(player[0].animTarget==dropkickanim)tutorialsuccess=1;
- break; case 20: if(player[0].animTarget==rabbitkickanim)tutorialsuccess=1;
- break; case 21: if(bonus==cannon)tutorialsuccess=1;
- break; case 22: if(bonus==spinecrusher)tutorialsuccess=1;
- break; case 23: if(player[0].animTarget==walljumprightkickanim||player[0].animTarget==walljumpleftkickanim)tutorialsuccess=1;
- break; case 24: if(player[0].animTarget==rabbittacklinganim)tutorialsuccess=1;
- break; case 25: if(player[0].animTarget==backhandspringanim)tutorialsuccess=1;
- break; case 28: if(animation[player[0].animTarget].attack==reversed&&player[0].feint)tutorialsuccess=1;
- break; case 29:
- if(player[0].escapednum==2) {
- tutorialsuccess=1;
- reversaltrain=0;
- cananger=0;
- player[1].aitype=passivetype;
- }
- break; case 33: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
- break; case 34: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
- break; case 35:
- if(animation[player[0].animTarget].attack==reversal){
- tutorialsuccess=1;
- reversaltrain=0;
- cananger=0;
- player[1].aitype=passivetype;
- }
- break; case 40: if(player[0].num_weapons>0)tutorialsuccess=1;
- break; case 41: if(player[0].weaponactive==-1&&player[0].num_weapons>0)tutorialsuccess=1;
- break; case 43: if(player[0].animTarget==knifeslashstartanim)tutorialsuccess=1;
- break; case 44: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
- break; case 45: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
- break; case 46: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
- break; case 49: if(player[1].weaponstuck!=-1)tutorialsuccess=1;
- break; default: break;
- }
- if(tutorialsuccess>=1)tutorialstagetime=tutorialmaxtime-3;
- if(tutorialstagetime==tutorialmaxtime-3){
- emit_sound_np(consolesuccesssound);
- }
+ //~ int texsize;
+ //~ texsize=512*512*3/texdetail/texdetail;
- if(tutorialsuccess>=1){
- if(tutorialstage==34||tutorialstage==35)
- tutorialstagetime=tutorialmaxtime-1;
- }
- }
+ player[i].skeleton.drawmodel.textureptr.load(creatureskin[player[i].creature][player[i].whichskin], 1, &player[i].skeleton.skinText[0], &player[i].skeleton.skinsize);
- if(tutorialstage<14||tutorialstage>=50){
- player[1].coords.y=300;
- player[1].velocity=0;
- }
-}
+ if (player[i].numclothes) {
+ for (int j = 0; j < player[i].numclothes; j++) {
+ tintr = player[i].clothestintr[j];
+ tintg = player[i].clothestintg[j];
+ tintb = player[i].clothestintb[j];
+ AddClothes((char *)player[i].clothes[j], &player[i].skeleton.skinText[0]);
+ }
+ player[i].DoMipmaps();
+ }
-void doDebugKeys(){
- float headprop,bodyprop,armprop,legprop;
- if(debugmode){
- if(Input::isKeyPressed(SDLK_h)){
- player[0].damagetolerance=200000;
- player[0].damage=0;
- player[0].burnt=0;
- player[0].permanentdamage=0;
- player[0].superpermanentdamage=0;
- }
+ player[i].animCurrent = bounceidleanim;
+ player[i].animTarget = bounceidleanim;
+ player[i].frameCurrent = 0;
+ player[i].frameTarget = 1;
+ player[i].target = 0;
+ player[i].speed = 1 + (float)(Random() % 100) / 1000;
+ if (difficulty == 0)
+ player[i].speed -= .2;
+ if (difficulty == 1)
+ player[i].speed -= .1;
+
+ player[i].velocity = 0;
+ player[i].oldcoords = player[i].coords;
+ player[i].realoldcoords = player[i].coords;
+
+ player[i].id = i;
+ player[i].skeleton.id = i;
+ player[i].updatedelay = 0;
+ player[i].normalsupdatedelay = 0;
+
+ player[i].aitype = passivetype;
+ player[i].madskills = 0;
+
+ if (i == 0) {
+ player[i].proportionhead = 1.2;
+ player[i].proportionbody = 1.05;
+ player[i].proportionarms = 1.00;
+ player[i].proportionlegs = 1.1;
+ player[i].proportionlegs.y = 1.05;
+ }
+ player[i].headless = 0;
+ player[i].currentoffset = 0;
+ player[i].targetoffset = 0;
- if(Input::isKeyPressed(SDLK_j)){
- environment++;
- if(environment>2)
- environment=0;
- Setenvironment(environment);
- }
+ player[i].damagetolerance = 200;
- if(Input::isKeyPressed(SDLK_c)){
- cameramode=1-cameramode;
- }
+ if (player[i].creature == wolftype) {
+ if (i == 0 || player[i].scale < 0)
+ player[i].scale = .23;
+ player[i].damagetolerance = 300;
+ }
- if(Input::isKeyPressed(SDLK_x)&&!Input::isKeyDown(SDLK_LSHIFT)){
- if(player[0].num_weapons>0){
- if(weapons[player[0].weaponids[0]].getType()==sword)
- weapons[player[0].weaponids[0]].setType(staff);
- else if(weapons[player[0].weaponids[0]].getType()==staff)
- weapons[player[0].weaponids[0]].setType(knife);
- else
- weapons[player[0].weaponids[0]].setType(sword);
+ if (visibleloading)
+ LoadingScreen();
+ if (cellophane) {
+ player[i].proportionhead.z = 0;
+ player[i].proportionbody.z = 0;
+ player[i].proportionarms.z = 0;
+ player[i].proportionlegs.z = 0;
}
+
+ player[i].tempanimation.Load((char *)"Tempanim", 0, 0);
+
+ player[i].headmorphness = 0;
+ player[i].targetheadmorphness = 1;
+ player[i].headmorphstart = 0;
+ player[i].headmorphend = 0;
+
+ player[i].pausetime = 0;
+
+ player[i].dead = 0;
+ player[i].jumppower = 5;
+ player[i].damage = 0;
+ player[i].permanentdamage = 0;
+ player[i].superpermanentdamage = 0;
+
+ player[i].forwardkeydown = 0;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].jumpkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].throwkeydown = 0;
+
+ player[i].collided = -10;
+ player[i].loaded = 1;
+ player[i].bloodloss = 0;
+ player[i].weaponactive = -1;
+ player[i].weaponstuck = -1;
+ player[i].bleeding = 0;
+ player[i].deathbleeding = 0;
+ player[i].stunned = 0;
+ player[i].hasvictim = 0;
+ player[i].wentforweapon = 0;
}
- if(Input::isKeyPressed(SDLK_x)&&Input::isKeyDown(SDLK_LSHIFT)){
- int closest=findClosestPlayer();
- if(closest>=0){
- if(player[closest].num_weapons){
- if(weapons[player[closest].weaponids[0]].getType()==sword)
- weapons[player[closest].weaponids[0]].setType(staff);
- else if(weapons[player[closest].weaponids[0]].getType()==staff)
- weapons[player[closest].weaponids[0]].setType(knife);
- else
- weapons[player[closest].weaponids[0]].setType(sword);
- }
- if(!player[closest].num_weapons){
- player[closest].weaponids[0]=weapons.size();
-
- weapons.push_back(Weapon(knife,closest));
-
- player[closest].num_weapons=1;
- }
- }
+ player[0].aitype = playercontrolled;
+ player[0].weaponactive = -1;
+
+ if (difficulty == 1)
+ player[0].power = 1 / .9;
+
+ if (difficulty == 0)
+ player[0].power = 1 / .8;
+
+ if (difficulty == 1)
+ player[0].damagetolerance = 250;
+ if (difficulty == 0)
+ player[0].damagetolerance = 300;
+ if (difficulty == 0)
+ player[0].armorhead *= 1.5;
+ if (difficulty == 0)
+ player[0].armorhigh *= 1.5;
+ if (difficulty == 0)
+ player[0].armorlow *= 1.5;
+ cameraloc = player[0].coords;
+ cameraloc.y += 5;
+ yaw = player[0].yaw;
+
+ hawkcoords = player[0].coords;
+ hawkcoords.y += 30;
+
+ if (visibleloading)
+ LoadingScreen();
+ //~ for(int i=0;i<weapons.size();i++){
+ //~ }
+
+ LOG("Starting background music...");
+
+ OPENAL_StopSound(OPENAL_ALL);
+ if (environment == snowyenvironment) {
+ if (ambientsound)
+ emit_stream_np(stream_wind);
+ } else if (environment == desertenvironment) {
+ if (ambientsound)
+ emit_stream_np(stream_desertambient);
+ } else if (environment == grassyenvironment) {
+ if (ambientsound)
+ emit_stream_np(stream_wind, 100.);
}
+ oldmusicvolume[0] = 0;
+ oldmusicvolume[1] = 0;
+ oldmusicvolume[2] = 0;
+ oldmusicvolume[3] = 0;
+
+ if (!firstload)
+ firstload = 1;
+ } else {
+ perror("Problem");
+ }
+ leveltime = 0;
+ loadingstuff = 0;
+ visibleloading = 0;
+}
- if(Input::isKeyDown(SDLK_u)){
- int closest=findClosestPlayer();
- if(closest>=0){
- player[closest].yaw+=multiplier*50;
- player[closest].targetyaw=player[closest].yaw;
- }
+void doTutorial()
+{
+ if (tutorialstagetime > tutorialmaxtime) {
+ tutorialstage++;
+ tutorialsuccess = 0;
+ if (tutorialstage <= 1) {
+ canattack = 0;
+ cananger = 0;
+ reversaltrain = 0;
}
+ switch (tutorialstage) {
+ case 1:
+ tutorialmaxtime = 5;
+ break;
+ case 2:
+ tutorialmaxtime = 2;
+ break;
+ case 3:
+ tutorialmaxtime = 600;
+ break;
+ case 4:
+ tutorialmaxtime = 1000;
+ break;
+ case 5:
+ tutorialmaxtime = 600;
+ break;
+ case 6:
+ tutorialmaxtime = 600;
+ break;
+ case 7:
+ tutorialmaxtime = 600;
+ break;
+ case 8:
+ tutorialmaxtime = 600;
+ break;
+ case 9:
+ tutorialmaxtime = 600;
+ break;
+ case 10:
+ tutorialmaxtime = 2;
+ break;
+ case 11:
+ tutorialmaxtime = 1000;
+ break;
+ case 12:
+ tutorialmaxtime = 1000;
+ break;
+ case 13:
+ tutorialmaxtime = 2;
+ break;
+ case 14: {
+ tutorialmaxtime = 3;
+ XYZ temp, temp2;
- if(Input::isKeyPressed(SDLK_o)&&!Input::isKeyDown(SDLK_LSHIFT)){
- int closest=findClosestPlayer();
- if(Input::isKeyDown(SDLK_LCTRL))
- closest=0;
+ temp.x = 1011;
+ temp.y = 84;
+ temp.z = 491;
+ temp2.x = 1025;
+ temp2.y = 75;
+ temp2.z = 447;
- if(closest>=0){
- player[closest].whichskin++;
- if(player[closest].whichskin>9)
- player[closest].whichskin=0;
- if(player[closest].whichskin>2&&player[closest].creature==wolftype)
- player[closest].whichskin=0;
+ player[1].coords = (temp + temp2) / 2;
- player[closest].skeleton.drawmodel.textureptr.load(creatureskin[player[closest].creature][player[closest].whichskin],1,
- &player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize);
- }
+ emit_sound_at(fireendsound, player[1].coords);
- if(player[closest].numclothes){
- for(int i=0;i<player[closest].numclothes;i++){
- tintr=player[closest].clothestintr[i];
- tintg=player[closest].clothestintg[i];
- tintb=player[closest].clothestintb[i];
- AddClothes((char *)player[closest].clothes[i],&player[closest].skeleton.skinText[0]);
+ for (int i = 0; i < player[1].skeleton.num_joints; i++) {
+ if (Random() % 2 == 0) {
+ if (!player[1].skeleton.free)temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
+ if (player[1].skeleton.free)temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
+ if (!player[1].skeleton.free)temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
+ if (player[1].skeleton.free)temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
+ Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
}
- player[closest].DoMipmaps();
}
}
-
- if(Input::isKeyPressed(SDLK_o)&&Input::isKeyDown(SDLK_LSHIFT)){
- int closest=findClosestPlayer();
- if(closest>=0){
- if(player[closest].creature==wolftype){
- headprop=player[closest].proportionhead.x/1.1;
- bodyprop=player[closest].proportionbody.x/1.1;
- armprop=player[closest].proportionarms.x/1.1;
- legprop=player[closest].proportionlegs.x/1.1;
- }
-
- if(player[closest].creature==rabbittype){
- headprop=player[closest].proportionhead.x/1.2;
- bodyprop=player[closest].proportionbody.x/1.05;
- armprop=player[closest].proportionarms.x/1.00;
- legprop=player[closest].proportionlegs.x/1.1;
- }
-
-
- if(player[closest].creature==rabbittype){
- player[closest].skeleton.id=closest;
- player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf",(char *)":Data:Skeleton:Basic Figure Wolf Low",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Wolf.solid",(char *)":Data:Models:Wolf2.solid",(char *)":Data:Models:Wolf3.solid",(char *)":Data:Models:Wolf4.solid",(char *)":Data:Models:Wolf5.solid",(char *)":Data:Models:Wolf6.solid",(char *)":Data:Models:Wolf7.solid",(char *)":Data:Models:Wolflow.solid",(char *)":Data:Models:Belt.solid",0);
- player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg",1,&player[closest].skeleton.skinText[closest],&player[closest].skeleton.skinsize);
- player[closest].whichskin=0;
- player[closest].creature=wolftype;
-
- player[closest].proportionhead=1.1;
- player[closest].proportionbody=1.1;
- player[closest].proportionarms=1.1;
- player[closest].proportionlegs=1.1;
- player[closest].proportionlegs.y=1.1;
- player[closest].scale=.23*5*player[0].scale;
-
- player[closest].damagetolerance=300;
- }
+ break;
+ case 15:
+ tutorialmaxtime = 500;
+ break;
+ case 16:
+ tutorialmaxtime = 500;
+ break;
+ case 17:
+ tutorialmaxtime = 500;
+ break;
+ case 18:
+ tutorialmaxtime = 500;
+ break;
+ case 19:
+ tutorialstage = 20;
+ //tutorialmaxtime=500;
+ break;
+ case 20:
+ tutorialmaxtime = 500;
+ break;
+ case 21:
+ tutorialmaxtime = 500;
+ if (bonus == cannon) {
+ bonus = Slicebonus;
+ againbonus = 1;
+ } else againbonus = 0;
+ break;
+ case 22:
+ tutorialmaxtime = 500;
+ break;
+ case 23:
+ tutorialmaxtime = 500;
+ break;
+ case 24:
+ tutorialmaxtime = 500;
+ break;
+ case 25:
+ tutorialmaxtime = 500;
+ break;
+ case 26:
+ tutorialmaxtime = 2;
+ break;
+ case 27:
+ tutorialmaxtime = 4;
+ reversaltrain = 1;
+ cananger = 1;
+ player[1].aitype = attacktypecutoff;
+ break;
+ case 28:
+ tutorialmaxtime = 400;
+ break;
+ case 29:
+ tutorialmaxtime = 400;
+ player[0].escapednum = 0;
+ break;
+ case 30:
+ tutorialmaxtime = 4;
+ reversaltrain = 0;
+ cananger = 0;
+ player[1].aitype = passivetype;
+ break;
+ case 31:
+ tutorialmaxtime = 13;
+ break;
+ case 32:
+ tutorialmaxtime = 8;
+ break;
+ case 33:
+ tutorialmaxtime = 400;
+ cananger = 1;
+ canattack = 1;
+ player[1].aitype = attacktypecutoff;
+ break;
+ case 34:
+ tutorialmaxtime = 400;
+ break;
+ case 35:
+ tutorialmaxtime = 400;
+ break;
+ case 36:
+ tutorialmaxtime = 2;
+ reversaltrain = 0;
+ cananger = 0;
+ player[1].aitype = passivetype;
+ break;
+ case 37:
+ damagedealt = 0;
+ damagetaken = 0;
+ tutorialmaxtime = 50;
+ cananger = 1;
+ canattack = 1;
+ player[1].aitype = attacktypecutoff;
+ break;
+ case 38:
+ tutorialmaxtime = 4;
+ canattack = 0;
+ cananger = 0;
+ player[1].aitype = passivetype;
+ break;
+ case 39: {
+ XYZ temp, temp2;
+
+ temp.x = 1011;
+ temp.y = 84;
+ temp.z = 491;
+ temp2.x = 1025;
+ temp2.y = 75;
+ temp2.z = 447;
+
+ Weapon w(knife, -1);
+ w.position = (temp + temp2) / 2;
+ w.tippoint = (temp + temp2) / 2;
+
+ w.velocity = 0.1;
+ w.tipvelocity = 0.1;
+ w.missed = 1;
+ w.hitsomething = 0;
+ w.freetime = 0;
+ w.firstfree = 1;
+ w.physics = 1;
+
+ weapons.push_back(w);
+ }
+ break;
+ case 40:
+ tutorialmaxtime = 300;
+ break;
+ case 41:
+ tutorialmaxtime = 300;
+ break;
+ case 42:
+ tutorialmaxtime = 8;
+ break;
+ case 43:
+ tutorialmaxtime = 300;
+ break;
+ case 44:
+ weapons[0].owner = 1;
+ player[0].weaponactive = -1;
+ player[0].num_weapons = 0;
+ player[1].weaponactive = 0;
+ player[1].num_weapons = 1;
+ player[1].weaponids[0] = 0;
+
+ cananger = 1;
+ canattack = 1;
+ player[1].aitype = attacktypecutoff;
+
+ tutorialmaxtime = 300;
+ break;
+ case 45:
+ weapons[0].owner = 1;
+ player[0].weaponactive = -1;
+ player[0].num_weapons = 0;
+ player[1].weaponactive = 0;
+ player[1].num_weapons = 1;
+ player[1].weaponids[0] = 0;
+
+ tutorialmaxtime = 300;
+ break;
+ case 46:
+ weapons[0].owner = 1;
+ player[0].weaponactive = -1;
+ player[0].num_weapons = 0;
+ player[1].weaponactive = 0;
+ player[1].num_weapons = 1;
+ player[1].weaponids[0] = 0;
+
+ weapons[0].setType(sword);
+
+ tutorialmaxtime = 300;
+ break;
+ case 47: {
+ tutorialmaxtime = 10;
+
+ XYZ temp, temp2;
+
+ temp.x = 1011;
+ temp.y = 84;
+ temp.z = 491;
+ temp2.x = 1025;
+ temp2.y = 75;
+ temp2.z = 447;
+
+ Weapon w(sword, -1);
+ w.position = (temp + temp2) / 2;
+ w.tippoint = (temp + temp2) / 2;
+
+ w.velocity = 0.1;
+ w.tipvelocity = 0.1;
+ w.missed = 1;
+ w.hitsomething = 0;
+ w.freetime = 0;
+ w.firstfree = 1;
+ w.physics = 1;
+
+ weapons.push_back(w);
+
+ weapons[0].owner = 1;
+ weapons[1].owner = 0;
+ player[0].weaponactive = 0;
+ player[0].num_weapons = 1;
+ player[0].weaponids[0] = 1;
+ player[1].weaponactive = 0;
+ player[1].num_weapons = 1;
+ player[1].weaponids[0] = 0;
+
+ }
+ break;
+ case 48:
+ canattack = 0;
+ cananger = 0;
+ player[1].aitype = passivetype;
+
+ tutorialmaxtime = 15;
+
+ weapons[0].owner = 1;
+ weapons[1].owner = 0;
+ player[0].weaponactive = 0;
+ player[0].num_weapons = 1;
+ player[0].weaponids[0] = 1;
+ player[1].weaponactive = 0;
+ player[1].num_weapons = 1;
+ player[1].weaponids[0] = 0;
+
+ if (player[0].weaponactive != -1)
+ weapons[player[0].weaponids[player[0].weaponactive]].setType(staff);
+ else
+ weapons[0].setType(staff);
+ break;
+ case 49:
+ canattack = 0;
+ cananger = 0;
+ player[1].aitype = passivetype;
+
+ tutorialmaxtime = 200;
+
+ weapons[1].position = 1000;
+ weapons[1].tippoint = 1000;
+
+ weapons[0].setType(knife);
+
+ weapons[0].owner = 0;
+ player[1].weaponactive = -1;
+ player[1].num_weapons = 0;
+ player[0].weaponactive = 0;
+ player[0].num_weapons = 1;
+ player[0].weaponids[0] = 0;
+
+ break;
+ case 50: {
+ tutorialmaxtime = 8;
+
+ XYZ temp, temp2;
+ emit_sound_at(fireendsound, player[1].coords);
+
+ for (int i = 0; i < player[1].skeleton.num_joints; i++) {
+ if (Random() % 2 == 0) {
+ if (!player[1].skeleton.free)temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
+ if (player[1].skeleton.free)temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
+ if (!player[1].skeleton.free)temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
+ if (player[1].skeleton.free)temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
+ Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
+ }
+ }
+
+ player[1].num_weapons = 0;
+ player[1].weaponstuck = -1;
+ player[1].weaponactive = -1;
+
+ weapons.clear();
+ }
+ break;
+ case 51:
+ tutorialmaxtime = 80000;
+ break;
+ default:
+ break;
+ }
+ if (tutorialstage <= 51)tutorialstagetime = 0;
+ }
+
+ //Tutorial success
+ if (tutorialstagetime < tutorialmaxtime - 3) {
+ switch (tutorialstage) {
+ case 3:
+ if (deltah || deltav)tutorialsuccess += multiplier;
+ break;
+ case 4:
+ if (player[0].forwardkeydown || player[0].backkeydown || player[0].leftkeydown || player[0].rightkeydown)tutorialsuccess += multiplier;
+ break;
+ case 5:
+ if (player[0].jumpkeydown)tutorialsuccess = 1;
+ break;
+ case 6:
+ if (player[0].isCrouch())tutorialsuccess = 1;
+ break;
+ case 7:
+ if (player[0].animTarget == rollanim)tutorialsuccess = 1;
+ break;
+ case 8:
+ if (player[0].animTarget == sneakanim)tutorialsuccess += multiplier;
+ break;
+ case 9:
+ if (player[0].animTarget == rabbitrunninganim || player[0].animTarget == wolfrunninganim)tutorialsuccess += multiplier;
+ break;
+ case 11:
+ if (player[0].isWallJump())tutorialsuccess = 1;
+ break;
+ case 12:
+ if (player[0].animTarget == flipanim)tutorialsuccess = 1;
+ break;
+ case 15:
+ if (player[0].animTarget == upunchanim || player[0].animTarget == winduppunchanim)tutorialsuccess = 1;
+ break;
+ case 16:
+ if (player[0].animTarget == winduppunchanim)tutorialsuccess = 1;
+ break;
+ case 17:
+ if (player[0].animTarget == spinkickanim)tutorialsuccess = 1;
+ break;
+ case 18:
+ if (player[0].animTarget == sweepanim)tutorialsuccess = 1;
+ break;
+ case 19:
+ if (player[0].animTarget == dropkickanim)tutorialsuccess = 1;
+ break;
+ case 20:
+ if (player[0].animTarget == rabbitkickanim)tutorialsuccess = 1;
+ break;
+ case 21:
+ if (bonus == cannon)tutorialsuccess = 1;
+ break;
+ case 22:
+ if (bonus == spinecrusher)tutorialsuccess = 1;
+ break;
+ case 23:
+ if (player[0].animTarget == walljumprightkickanim || player[0].animTarget == walljumpleftkickanim)tutorialsuccess = 1;
+ break;
+ case 24:
+ if (player[0].animTarget == rabbittacklinganim)tutorialsuccess = 1;
+ break;
+ case 25:
+ if (player[0].animTarget == backhandspringanim)tutorialsuccess = 1;
+ break;
+ case 28:
+ if (animation[player[0].animTarget].attack == reversed && player[0].feint)tutorialsuccess = 1;
+ break;
+ case 29:
+ if (player[0].escapednum == 2) {
+ tutorialsuccess = 1;
+ reversaltrain = 0;
+ cananger = 0;
+ player[1].aitype = passivetype;
+ }
+ break;
+ case 33:
+ if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+ break;
+ case 34:
+ if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+ break;
+ case 35:
+ if (animation[player[0].animTarget].attack == reversal) {
+ tutorialsuccess = 1;
+ reversaltrain = 0;
+ cananger = 0;
+ player[1].aitype = passivetype;
+ }
+ break;
+ case 40:
+ if (player[0].num_weapons > 0)tutorialsuccess = 1;
+ break;
+ case 41:
+ if (player[0].weaponactive == -1 && player[0].num_weapons > 0)tutorialsuccess = 1;
+ break;
+ case 43:
+ if (player[0].animTarget == knifeslashstartanim)tutorialsuccess = 1;
+ break;
+ case 44:
+ if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+ break;
+ case 45:
+ if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+ break;
+ case 46:
+ if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+ break;
+ case 49:
+ if (player[1].weaponstuck != -1)tutorialsuccess = 1;
+ break;
+ default:
+ break;
+ }
+ if (tutorialsuccess >= 1)tutorialstagetime = tutorialmaxtime - 3;
+
+
+ if (tutorialstagetime == tutorialmaxtime - 3) {
+ emit_sound_np(consolesuccesssound);
+ }
+
+ if (tutorialsuccess >= 1) {
+ if (tutorialstage == 34 || tutorialstage == 35)
+ tutorialstagetime = tutorialmaxtime - 1;
+ }
+ }
+
+ if (tutorialstage < 14 || tutorialstage >= 50) {
+ player[1].coords.y = 300;
+ player[1].velocity = 0;
+ }
+}
+
+void doDebugKeys()
+{
+ float headprop, bodyprop, armprop, legprop;
+ if (debugmode) {
+ if (Input::isKeyPressed(SDLK_h)) {
+ player[0].damagetolerance = 200000;
+ player[0].damage = 0;
+ player[0].burnt = 0;
+ player[0].permanentdamage = 0;
+ player[0].superpermanentdamage = 0;
+ }
+
+ if (Input::isKeyPressed(SDLK_j)) {
+ environment++;
+ if (environment > 2)
+ environment = 0;
+ Setenvironment(environment);
+ }
+
+ if (Input::isKeyPressed(SDLK_c)) {
+ cameramode = 1 - cameramode;
+ }
+
+ if (Input::isKeyPressed(SDLK_x) && !Input::isKeyDown(SDLK_LSHIFT)) {
+ if (player[0].num_weapons > 0) {
+ if (weapons[player[0].weaponids[0]].getType() == sword)
+ weapons[player[0].weaponids[0]].setType(staff);
+ else if (weapons[player[0].weaponids[0]].getType() == staff)
+ weapons[player[0].weaponids[0]].setType(knife);
else
- {
- player[closest].skeleton.id=closest;
- player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
- player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg",1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize);
- player[closest].whichskin=0;
- player[closest].creature=rabbittype;
-
- player[closest].proportionhead=1.2;
- player[closest].proportionbody=1.05;
- player[closest].proportionarms=1.00;
- player[closest].proportionlegs=1.1;
- player[closest].proportionlegs.y=1.05;
- player[closest].scale=.2*5*player[0].scale;
-
- player[closest].damagetolerance=200;
+ weapons[player[0].weaponids[0]].setType(sword);
+ }
+ }
+
+ if (Input::isKeyPressed(SDLK_x) && Input::isKeyDown(SDLK_LSHIFT)) {
+ int closest = findClosestPlayer();
+ if (closest >= 0) {
+ if (player[closest].num_weapons) {
+ if (weapons[player[closest].weaponids[0]].getType() == sword)
+ weapons[player[closest].weaponids[0]].setType(staff);
+ else if (weapons[player[closest].weaponids[0]].getType() == staff)
+ weapons[player[closest].weaponids[0]].setType(knife);
+ else
+ weapons[player[closest].weaponids[0]].setType(sword);
}
+ if (!player[closest].num_weapons) {
+ player[closest].weaponids[0] = weapons.size();
- if(player[closest].creature==wolftype){
- player[closest].proportionhead=1.1*headprop;
- player[closest].proportionbody=1.1*bodyprop;
- player[closest].proportionarms=1.1*armprop;
- player[closest].proportionlegs=1.1*legprop;
+ weapons.push_back(Weapon(knife, closest));
+
+ player[closest].num_weapons = 1;
}
+ }
+ }
+
+ if (Input::isKeyDown(SDLK_u)) {
+ int closest = findClosestPlayer();
+ if (closest >= 0) {
+ player[closest].yaw += multiplier * 50;
+ player[closest].targetyaw = player[closest].yaw;
+ }
+ }
+
+
+ if (Input::isKeyPressed(SDLK_o) && !Input::isKeyDown(SDLK_LSHIFT)) {
+ int closest = findClosestPlayer();
+ if (Input::isKeyDown(SDLK_LCTRL))
+ closest = 0;
+
+ if (closest >= 0) {
+ player[closest].whichskin++;
+ if (player[closest].whichskin > 9)
+ player[closest].whichskin = 0;
+ if (player[closest].whichskin > 2 && player[closest].creature == wolftype)
+ player[closest].whichskin = 0;
+
+ player[closest].skeleton.drawmodel.textureptr.load(creatureskin[player[closest].creature][player[closest].whichskin], 1,
+ &player[closest].skeleton.skinText[0], &player[closest].skeleton.skinsize);
+ }
- if(player[closest].creature==rabbittype){
- player[closest].proportionhead=1.2*headprop;
- player[closest].proportionbody=1.05*bodyprop;
- player[closest].proportionarms=1.00*armprop;
- player[closest].proportionlegs=1.1*legprop;
- player[closest].proportionlegs.y=1.05*legprop;
+ if (player[closest].numclothes) {
+ for (int i = 0; i < player[closest].numclothes; i++) {
+ tintr = player[closest].clothestintr[i];
+ tintg = player[closest].clothestintg[i];
+ tintb = player[closest].clothestintb[i];
+ AddClothes((char *)player[closest].clothes[i], &player[closest].skeleton.skinText[0]);
+ }
+ player[closest].DoMipmaps();
+ }
+ }
+
+ if (Input::isKeyPressed(SDLK_o) && Input::isKeyDown(SDLK_LSHIFT)) {
+ int closest = findClosestPlayer();
+ if (closest >= 0) {
+ if (player[closest].creature == wolftype) {
+ headprop = player[closest].proportionhead.x / 1.1;
+ bodyprop = player[closest].proportionbody.x / 1.1;
+ armprop = player[closest].proportionarms.x / 1.1;
+ legprop = player[closest].proportionlegs.x / 1.1;
+ }
+
+ if (player[closest].creature == rabbittype) {
+ headprop = player[closest].proportionhead.x / 1.2;
+ bodyprop = player[closest].proportionbody.x / 1.05;
+ armprop = player[closest].proportionarms.x / 1.00;
+ legprop = player[closest].proportionlegs.x / 1.1;
+ }
+
+
+ if (player[closest].creature == rabbittype) {
+ player[closest].skeleton.id = closest;
+ player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf", (char *)":Data:Skeleton:Basic Figure Wolf Low", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Wolf.solid", (char *)":Data:Models:Wolf2.solid", (char *)":Data:Models:Wolf3.solid", (char *)":Data:Models:Wolf4.solid", (char *)":Data:Models:Wolf5.solid", (char *)":Data:Models:Wolf6.solid", (char *)":Data:Models:Wolf7.solid", (char *)":Data:Models:Wolflow.solid", (char *)":Data:Models:Belt.solid", 0);
+ player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &player[closest].skeleton.skinText[closest], &player[closest].skeleton.skinsize);
+ player[closest].whichskin = 0;
+ player[closest].creature = wolftype;
+
+ player[closest].proportionhead = 1.1;
+ player[closest].proportionbody = 1.1;
+ player[closest].proportionarms = 1.1;
+ player[closest].proportionlegs = 1.1;
+ player[closest].proportionlegs.y = 1.1;
+ player[closest].scale = .23 * 5 * player[0].scale;
+
+ player[closest].damagetolerance = 300;
+ } else {
+ player[closest].skeleton.id = closest;
+ player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure", (char *)":Data:Skeleton:Basic Figurelow", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Body.solid", (char *)":Data:Models:Body2.solid", (char *)":Data:Models:Body3.solid", (char *)":Data:Models:Body4.solid", (char *)":Data:Models:Body5.solid", (char *)":Data:Models:Body6.solid", (char *)":Data:Models:Body7.solid", (char *)":Data:Models:Bodylow.solid", (char *)":Data:Models:Belt.solid", 1);
+ player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg", 1, &player[closest].skeleton.skinText[0], &player[closest].skeleton.skinsize);
+ player[closest].whichskin = 0;
+ player[closest].creature = rabbittype;
+
+ player[closest].proportionhead = 1.2;
+ player[closest].proportionbody = 1.05;
+ player[closest].proportionarms = 1.00;
+ player[closest].proportionlegs = 1.1;
+ player[closest].proportionlegs.y = 1.05;
+ player[closest].scale = .2 * 5 * player[0].scale;
+
+ player[closest].damagetolerance = 200;
+ }
+
+ if (player[closest].creature == wolftype) {
+ player[closest].proportionhead = 1.1 * headprop;
+ player[closest].proportionbody = 1.1 * bodyprop;
+ player[closest].proportionarms = 1.1 * armprop;
+ player[closest].proportionlegs = 1.1 * legprop;
+ }
+
+ if (player[closest].creature == rabbittype) {
+ player[closest].proportionhead = 1.2 * headprop;
+ player[closest].proportionbody = 1.05 * bodyprop;
+ player[closest].proportionarms = 1.00 * armprop;
+ player[closest].proportionlegs = 1.1 * legprop;
+ player[closest].proportionlegs.y = 1.05 * legprop;
}
}
}
- if(Input::isKeyPressed(SDLK_b)&&!Input::isKeyDown(SDLK_LSHIFT)){
- slomo=1-slomo;
- slomodelay=1000;
+ if (Input::isKeyPressed(SDLK_b) && !Input::isKeyDown(SDLK_LSHIFT)) {
+ slomo = 1 - slomo;
+ slomodelay = 1000;
}
- if(((Input::isKeyPressed(SDLK_i)&&!Input::isKeyDown(SDLK_LSHIFT)))){
+ if (((Input::isKeyPressed(SDLK_i) && !Input::isKeyDown(SDLK_LSHIFT)))) {
int closest = -1;
float closestdist = std::numeric_limits<float>::max();
- for(int i=1; i<numplayers; i++){
+ for (int i = 1; i < numplayers; i++) {
float distance = distsq(&player[i].coords, &player[0].coords);
- if(!player[i].headless)
- if(distance < closestdist){
+ if (!player[i].headless)
+ if (distance < closestdist) {
closestdist = distance;
closest = i;
}
}
- XYZ flatfacing2,flatvelocity2;
+ XYZ flatfacing2, flatvelocity2;
XYZ blah;
- if(closest!=-1 && distsq(&player[closest].coords, &player[0].coords)<144){
+ if (closest != -1 && distsq(&player[closest].coords, &player[0].coords) < 144) {
blah = player[closest].coords;
XYZ headspurtdirection;
//int i = player[closest].skeleton.jointlabels[head];
- Joint& headjoint= player[closest].joint(head);
- for(int k=0;k<player[closest].skeleton.num_joints; k++){
- if(!player[closest].skeleton.free)
- flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)
- flatvelocity2=headjoint.velocity;
- if(!player[closest].skeleton.free)
- flatfacing2=DoRotation(DoRotation(DoRotation(headjoint.position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)
- flatfacing2=headjoint.position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- headspurtdirection=headjoint.position-player[closest].jointPos(neck);
+ Joint& headjoint = player[closest].joint(head);
+ for (int k = 0; k < player[closest].skeleton.num_joints; k++) {
+ if (!player[closest].skeleton.free)
+ flatvelocity2 = player[closest].velocity;
+ if (player[closest].skeleton.free)
+ flatvelocity2 = headjoint.velocity;
+ if (!player[closest].skeleton.free)
+ flatfacing2 = DoRotation(DoRotation(DoRotation(headjoint.position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+ if (player[closest].skeleton.free)
+ flatfacing2 = headjoint.position * player[closest].scale + player[closest].coords;
+ flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+ headspurtdirection = headjoint.position - player[closest].jointPos(neck);
Normalise(&headspurtdirection);
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, .6, 1);
- flatvelocity2+=headspurtdirection*8;
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2/2, 1,1,1, .16, 1);
+ Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, .6, 1);
+ flatvelocity2 += headspurtdirection * 8;
+ Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 / 2, 1, 1, 1, .16, 1);
}
- Sprite::MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
+ Sprite::MakeSprite(cloudsprite, flatfacing2, flatvelocity2 * 0, .6, 0, 0, 1, .5);
emit_sound_at(splattersound, blah);
emit_sound_at(breaksound2, blah, 100.);
- if(player[closest].skeleton.free==2)player[closest].skeleton.free=0;
+ if (player[closest].skeleton.free == 2)player[closest].skeleton.free = 0;
player[closest].RagDoll(0);
- player[closest].dead=2;
- player[closest].headless=1;
- player[closest].DoBloodBig(3,165);
+ player[closest].dead = 2;
+ player[closest].headless = 1;
+ player[closest].DoBloodBig(3, 165);
- camerashake+=.3;
+ camerashake += .3;
}
}
- if(((Input::isKeyPressed(SDLK_i)&&Input::isKeyDown(SDLK_LSHIFT)))){
- int closest=findClosestPlayer();
- XYZ flatfacing2,flatvelocity2;
+ if (((Input::isKeyPressed(SDLK_i) && Input::isKeyDown(SDLK_LSHIFT)))) {
+ int closest = findClosestPlayer();
+ XYZ flatfacing2, flatvelocity2;
XYZ blah;
- if(closest>=0 && distsq(&player[closest].coords,&player[0].coords)<144){
- blah=player[closest].coords;
+ if (closest >= 0 && distsq(&player[closest].coords, &player[0].coords) < 144) {
+ blah = player[closest].coords;
emit_sound_at(splattersound, blah);
emit_sound_at(breaksound2, blah);
- for(int i=0;i<player[closest].skeleton.num_joints; i++){
- if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
- if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .3, 1);
- Sprite::MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
+ for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
+ if (!player[closest].skeleton.free)flatvelocity2 = player[closest].velocity;
+ if (player[closest].skeleton.free)flatvelocity2 = player[closest].skeleton.joints[i].velocity;
+ if (!player[closest].skeleton.free)flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+ if (player[closest].skeleton.free)flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
+ flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+ Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, 3, 1);
+ Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2, 1, 1, 1, .3, 1);
+ Sprite::MakeSprite(cloudsprite, flatfacing2, flatvelocity2 * 0, .6, 0, 0, 1, .5);
}
- for(int i=0;i<player[closest].skeleton.num_joints; i++){
- if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
- if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .4, 1);
+ for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
+ if (!player[closest].skeleton.free)flatvelocity2 = player[closest].velocity;
+ if (player[closest].skeleton.free)flatvelocity2 = player[closest].skeleton.joints[i].velocity;
+ if (!player[closest].skeleton.free)flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+ if (player[closest].skeleton.free)flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
+ flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+ Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, 3, 1);
+ Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2, 1, 1, 1, .4, 1);
}
- for(int i=0;i<player[closest].skeleton.num_joints; i++){
- if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
- if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2*2, 1,1,1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2*2, 1,1,1, .4, 1);
+ for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
+ if (!player[closest].skeleton.free)flatvelocity2 = player[closest].velocity;
+ if (player[closest].skeleton.free)flatvelocity2 = player[closest].skeleton.joints[i].velocity;
+ if (!player[closest].skeleton.free)flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+ if (player[closest].skeleton.free)flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
+ flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+ Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, 3, 1);
+ Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, .4, 1);
}
- for(int i=0;i<player[closest].skeleton.num_joints; i++){
- if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
- if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2*2, 1,1,1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2*2, 1,1,1, .4, 1);
+ for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
+ if (!player[closest].skeleton.free)flatvelocity2 = player[closest].velocity;
+ if (player[closest].skeleton.free)flatvelocity2 = player[closest].skeleton.joints[i].velocity;
+ if (!player[closest].skeleton.free)flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+ if (player[closest].skeleton.free)flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
+ flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+ flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+ Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, 3, 1);
+ Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, .4, 1);
}
XYZ temppos;
- for(int j=0;j<numplayers; j++){
- if(j!=closest){
- if(distsq(&player[j].coords,&player[closest].coords)<25){
- player[j].DoDamage((25-distsq(&player[j].coords,&player[closest].coords))*60);
- if(player[j].skeleton.free==2)
- player[j].skeleton.free=1;
- player[j].skeleton.longdead=0;
+ for (int j = 0; j < numplayers; j++) {
+ if (j != closest) {
+ if (distsq(&player[j].coords, &player[closest].coords) < 25) {
+ player[j].DoDamage((25 - distsq(&player[j].coords, &player[closest].coords)) * 60);
+ if (player[j].skeleton.free == 2)
+ player[j].skeleton.free = 1;
+ player[j].skeleton.longdead = 0;
player[j].RagDoll(0);
- for(int i=0;i<player[j].skeleton.num_joints; i++){
- temppos=player[j].skeleton.joints[i].position+player[j].coords;
- if(distsq(&temppos,&player[closest].coords)<25){
- flatvelocity2=temppos-player[closest].coords;
+ for (int i = 0; i < player[j].skeleton.num_joints; i++) {
+ temppos = player[j].skeleton.joints[i].position + player[j].coords;
+ if (distsq(&temppos, &player[closest].coords) < 25) {
+ flatvelocity2 = temppos - player[closest].coords;
Normalise(&flatvelocity2);
- player[j].skeleton.joints[i].velocity+=flatvelocity2*((20-distsq(&temppos,&player[closest].coords))*20);
+ player[j].skeleton.joints[i].velocity += flatvelocity2 * ((20 - distsq(&temppos, &player[closest].coords)) * 20);
}
}
}
player[closest].DoDamage(10000);
player[closest].RagDoll(0);
- player[closest].dead=2;
- player[closest].coords=20;
- player[closest].skeleton.free=2;
+ player[closest].dead = 2;
+ player[closest].coords = 20;
+ player[closest].skeleton.free = 2;
- camerashake+=.6;
+ camerashake += .6;
}
}
- if(Input::isKeyPressed(SDLK_f)){
- player[0].onfire=1-player[0].onfire;
- if(player[0].onfire){
+ if (Input::isKeyPressed(SDLK_f)) {
+ player[0].onfire = 1 - player[0].onfire;
+ if (player[0].onfire) {
player[0].CatchFire();
}
- if(!player[0].onfire){
+ if (!player[0].onfire) {
emit_sound_at(fireendsound, player[0].coords);
pause_sound(stream_firesound);
}
}
- if(Input::isKeyPressed(SDLK_n)&&!Input::isKeyDown(SDLK_LCTRL)){
+ if (Input::isKeyPressed(SDLK_n) && !Input::isKeyDown(SDLK_LCTRL)) {
//if(!player[0].skeleton.free)player[0].damage+=500;
player[0].RagDoll(0);
//player[0].spurt=1;
emit_sound_at(whooshsound, player[0].coords, 128.);
}
- if(Input::isKeyPressed(SDLK_n)&&Input::isKeyDown(SDLK_LCTRL)){
- for(int i=0;i<objects.numobjects;i++){
- if(objects.type[i]==treeleavestype){
- objects.scale[i]*=.9;
+ if (Input::isKeyPressed(SDLK_n) && Input::isKeyDown(SDLK_LCTRL)) {
+ for (int i = 0; i < objects.numobjects; i++) {
+ if (objects.type[i] == treeleavestype) {
+ objects.scale[i] *= .9;
}
}
}
- if(Input::isKeyPressed(SDLK_m)&&Input::isKeyDown(SDLK_LSHIFT)){
- editorenabled=1-editorenabled;
- if(editorenabled){
- player[0].damagetolerance=100000;
+ if (Input::isKeyPressed(SDLK_m) && Input::isKeyDown(SDLK_LSHIFT)) {
+ editorenabled = 1 - editorenabled;
+ if (editorenabled) {
+ player[0].damagetolerance = 100000;
} else {
- player[0].damagetolerance=200;
+ player[0].damagetolerance = 200;
}
- player[0].damage=0; // these lines were in both if and else, but I think they would better fit in the if
- player[0].permanentdamage=0;
- player[0].superpermanentdamage=0;
- player[0].bloodloss=0;
- player[0].deathbleeding=0;
+ player[0].damage = 0; // these lines were in both if and else, but I think they would better fit in the if
+ player[0].permanentdamage = 0;
+ player[0].superpermanentdamage = 0;
+ player[0].bloodloss = 0;
+ player[0].deathbleeding = 0;
}
//skip level
- if(whichlevel!=-2&&Input::isKeyPressed(SDLK_k)&&Input::isKeyDown(SDLK_LSHIFT)&&!editorenabled){
+ if (whichlevel != -2 && Input::isKeyPressed(SDLK_k) && Input::isKeyDown(SDLK_LSHIFT) && !editorenabled) {
targetlevel++;
- if(targetlevel>numchallengelevels-1)
- targetlevel=0;
- loading=1;
- leveltime=5;
+ if (targetlevel > numchallengelevels - 1)
+ targetlevel = 0;
+ loading = 1;
+ leveltime = 5;
}
- if(editorenabled){
- if(Input::isKeyPressed(SDLK_DELETE)&&Input::isKeyDown(SDLK_LSHIFT)){
- int closest=findClosestPlayer();
- if(closest>=0){
+ if (editorenabled) {
+ if (Input::isKeyPressed(SDLK_DELETE) && Input::isKeyDown(SDLK_LSHIFT)) {
+ int closest = findClosestPlayer();
+ if (closest >= 0) {
//player[closest]=player[numplayers-1];
//player[closest].skeleton=player[numplayers-1].skeleton;
numplayers--;
}
}
- if(Input::isKeyPressed(SDLK_DELETE)&&Input::isKeyDown(SDLK_LCTRL)){
- int closest=findClosestObject();
- if(closest>=0)
- objects.position[closest].y-=500;
+ if (Input::isKeyPressed(SDLK_DELETE) && Input::isKeyDown(SDLK_LCTRL)) {
+ int closest = findClosestObject();
+ if (closest >= 0)
+ objects.position[closest].y -= 500;
}
- if(Input::isKeyPressed(SDLK_m)&&Input::isKeyDown(SDLK_LSHIFT)){
+ if (Input::isKeyPressed(SDLK_m) && Input::isKeyDown(SDLK_LSHIFT)) {
//drawmode++;
//if(drawmode>2)drawmode=0;
- if(objects.numobjects<max_objects-1){
+ if (objects.numobjects < max_objects - 1) {
XYZ boxcoords;
- boxcoords.x=player[0].coords.x;
- boxcoords.z=player[0].coords.z;
- boxcoords.y=player[0].coords.y-3;
- if(editortype==bushtype)boxcoords.y=player[0].coords.y-.5;
- if(editortype==firetype)boxcoords.y=player[0].coords.y-.5;
+ boxcoords.x = player[0].coords.x;
+ boxcoords.z = player[0].coords.z;
+ boxcoords.y = player[0].coords.y - 3;
+ if (editortype == bushtype)boxcoords.y = player[0].coords.y - .5;
+ if (editortype == firetype)boxcoords.y = player[0].coords.y - .5;
//objects.MakeObject(abs(Random()%3),boxcoords,Random()%360);
- float temprotat,temprotat2;
- temprotat=editoryaw;
- temprotat2=editorpitch;
- if(temprotat<0||editortype==bushtype)temprotat=Random()%360;
- if(temprotat2<0)temprotat2=Random()%360;
-
- objects.MakeObject(editortype,boxcoords,(int)temprotat-((int)temprotat)%30,(int)temprotat2,editorsize);
- if(editortype==treetrunktype)
- objects.MakeObject(treeleavestype,boxcoords,Random()%360*(temprotat2<2)+(int)editoryaw-((int)editoryaw)%30,editorpitch,editorsize);
+ float temprotat, temprotat2;
+ temprotat = editoryaw;
+ temprotat2 = editorpitch;
+ if (temprotat < 0 || editortype == bushtype)temprotat = Random() % 360;
+ if (temprotat2 < 0)temprotat2 = Random() % 360;
+
+ objects.MakeObject(editortype, boxcoords, (int)temprotat - ((int)temprotat) % 30, (int)temprotat2, editorsize);
+ if (editortype == treetrunktype)
+ objects.MakeObject(treeleavestype, boxcoords, Random() % 360 * (temprotat2 < 2) + (int)editoryaw - ((int)editoryaw) % 30, editorpitch, editorsize);
}
}
- if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
- if(numplayers<maxplayers-1){
- player[numplayers].scale=.2*5*player[0].scale;
- player[numplayers].creature=rabbittype;
- player[numplayers].howactive=editoractive;
- player[numplayers].skeleton.id=numplayers;
- player[numplayers].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
+ if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
+ if (numplayers < maxplayers - 1) {
+ player[numplayers].scale = .2 * 5 * player[0].scale;
+ player[numplayers].creature = rabbittype;
+ player[numplayers].howactive = editoractive;
+ player[numplayers].skeleton.id = numplayers;
+ player[numplayers].skeleton.Load((char *)":Data:Skeleton:Basic Figure", (char *)":Data:Skeleton:Basic Figurelow", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Body.solid", (char *)":Data:Models:Body2.solid", (char *)":Data:Models:Body3.solid", (char *)":Data:Models:Body4.solid", (char *)":Data:Models:Body5.solid", (char *)":Data:Models:Body6.solid", (char *)":Data:Models:Body7.solid", (char *)":Data:Models:Bodylow.solid", (char *)":Data:Models:Belt.solid", 1);
//texsize=512*512*3/texdetail/texdetail;
//if(!player[numplayers].loaded)player[numplayers].skeleton.skinText = new GLubyte[texsize];
//player[numplayers].skeleton.skinText.resize(texsize);
- int k=abs(Random()%2)+1;
- if(k==0){
- player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg",1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin=0;
- }
- else if(k==1){
- player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur.jpg",1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin=1;
- }
- else {
- player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur2.jpg",1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin=2;
+ int k = abs(Random() % 2) + 1;
+ if (k == 0) {
+ player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
+ player[numplayers].whichskin = 0;
+ } else if (k == 1) {
+ player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
+ player[numplayers].whichskin = 1;
+ } else {
+ player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur2.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
+ player[numplayers].whichskin = 2;
}
- player[numplayers].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png",1,1);
- player[numplayers].power=1;
- player[numplayers].speedmult=1;
- player[numplayers].animCurrent=bounceidleanim;
- player[numplayers].animTarget=bounceidleanim;
- player[numplayers].frameCurrent=0;
- player[numplayers].frameTarget=1;
- player[numplayers].target=0;
- player[numplayers].bled=0;
- player[numplayers].speed=1+(float)(Random()%100)/1000;
-
- player[numplayers].targetyaw=player[0].targetyaw;
- player[numplayers].yaw=player[0].yaw;
-
- player[numplayers].velocity=0;
- player[numplayers].coords=player[0].coords;
- player[numplayers].oldcoords=player[numplayers].coords;
- player[numplayers].realoldcoords=player[numplayers].coords;
-
- player[numplayers].id=numplayers;
- player[numplayers].skeleton.id=numplayers;
- player[numplayers].updatedelay=0;
- player[numplayers].normalsupdatedelay=0;
-
- player[numplayers].aitype=passivetype;
-
- if(player[0].creature==wolftype){
- headprop=player[0].proportionhead.x/1.1;
- bodyprop=player[0].proportionbody.x/1.1;
- armprop=player[0].proportionarms.x/1.1;
- legprop=player[0].proportionlegs.x/1.1;
+ player[numplayers].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png", 1, 1);
+ player[numplayers].power = 1;
+ player[numplayers].speedmult = 1;
+ player[numplayers].animCurrent = bounceidleanim;
+ player[numplayers].animTarget = bounceidleanim;
+ player[numplayers].frameCurrent = 0;
+ player[numplayers].frameTarget = 1;
+ player[numplayers].target = 0;
+ player[numplayers].bled = 0;
+ player[numplayers].speed = 1 + (float)(Random() % 100) / 1000;
+
+ player[numplayers].targetyaw = player[0].targetyaw;
+ player[numplayers].yaw = player[0].yaw;
+
+ player[numplayers].velocity = 0;
+ player[numplayers].coords = player[0].coords;
+ player[numplayers].oldcoords = player[numplayers].coords;
+ player[numplayers].realoldcoords = player[numplayers].coords;
+
+ player[numplayers].id = numplayers;
+ player[numplayers].skeleton.id = numplayers;
+ player[numplayers].updatedelay = 0;
+ player[numplayers].normalsupdatedelay = 0;
+
+ player[numplayers].aitype = passivetype;
+
+ if (player[0].creature == wolftype) {
+ headprop = player[0].proportionhead.x / 1.1;
+ bodyprop = player[0].proportionbody.x / 1.1;
+ armprop = player[0].proportionarms.x / 1.1;
+ legprop = player[0].proportionlegs.x / 1.1;
}
- if(player[0].creature==rabbittype){
- headprop=player[0].proportionhead.x/1.2;
- bodyprop=player[0].proportionbody.x/1.05;
- armprop=player[0].proportionarms.x/1.00;
- legprop=player[0].proportionlegs.x/1.1;
+ if (player[0].creature == rabbittype) {
+ headprop = player[0].proportionhead.x / 1.2;
+ bodyprop = player[0].proportionbody.x / 1.05;
+ armprop = player[0].proportionarms.x / 1.00;
+ legprop = player[0].proportionlegs.x / 1.1;
}
- if(player[numplayers].creature==wolftype){
- player[numplayers].proportionhead=1.1*headprop;
- player[numplayers].proportionbody=1.1*bodyprop;
- player[numplayers].proportionarms=1.1*armprop;
- player[numplayers].proportionlegs=1.1*legprop;
+ if (player[numplayers].creature == wolftype) {
+ player[numplayers].proportionhead = 1.1 * headprop;
+ player[numplayers].proportionbody = 1.1 * bodyprop;
+ player[numplayers].proportionarms = 1.1 * armprop;
+ player[numplayers].proportionlegs = 1.1 * legprop;
}
- if(player[numplayers].creature==rabbittype){
- player[numplayers].proportionhead=1.2*headprop;
- player[numplayers].proportionbody=1.05*bodyprop;
- player[numplayers].proportionarms=1.00*armprop;
- player[numplayers].proportionlegs=1.1*legprop;
- player[numplayers].proportionlegs.y=1.05*legprop;
+ if (player[numplayers].creature == rabbittype) {
+ player[numplayers].proportionhead = 1.2 * headprop;
+ player[numplayers].proportionbody = 1.05 * bodyprop;
+ player[numplayers].proportionarms = 1.00 * armprop;
+ player[numplayers].proportionlegs = 1.1 * legprop;
+ player[numplayers].proportionlegs.y = 1.05 * legprop;
}
- player[numplayers].headless=0;
- player[numplayers].onfire=0;
+ player[numplayers].headless = 0;
+ player[numplayers].onfire = 0;
- if(cellophane){
- player[numplayers].proportionhead.z=0;
- player[numplayers].proportionbody.z=0;
- player[numplayers].proportionarms.z=0;
- player[numplayers].proportionlegs.z=0;
+ if (cellophane) {
+ player[numplayers].proportionhead.z = 0;
+ player[numplayers].proportionbody.z = 0;
+ player[numplayers].proportionarms.z = 0;
+ player[numplayers].proportionlegs.z = 0;
}
- player[numplayers].tempanimation.Load((char *)"Tempanim",0,0);
+ player[numplayers].tempanimation.Load((char *)"Tempanim", 0, 0);
- player[numplayers].damagetolerance=200;
+ player[numplayers].damagetolerance = 200;
- player[numplayers].protectionhead=player[0].protectionhead;
- player[numplayers].protectionhigh=player[0].protectionhigh;
- player[numplayers].protectionlow=player[0].protectionlow;
- player[numplayers].armorhead=player[0].armorhead;
- player[numplayers].armorhigh=player[0].armorhigh;
- player[numplayers].armorlow=player[0].armorlow;
- player[numplayers].metalhead=player[0].metalhead;
- player[numplayers].metalhigh=player[0].metalhigh;
- player[numplayers].metallow=player[0].metallow;
+ player[numplayers].protectionhead = player[0].protectionhead;
+ player[numplayers].protectionhigh = player[0].protectionhigh;
+ player[numplayers].protectionlow = player[0].protectionlow;
+ player[numplayers].armorhead = player[0].armorhead;
+ player[numplayers].armorhigh = player[0].armorhigh;
+ player[numplayers].armorlow = player[0].armorlow;
+ player[numplayers].metalhead = player[0].metalhead;
+ player[numplayers].metalhigh = player[0].metalhigh;
+ player[numplayers].metallow = player[0].metallow;
- player[numplayers].immobile=player[0].immobile;
+ player[numplayers].immobile = player[0].immobile;
- player[numplayers].numclothes=player[0].numclothes;
- if(player[numplayers].numclothes)
- for(int i=0;i<player[numplayers].numclothes;i++){
+ player[numplayers].numclothes = player[0].numclothes;
+ if (player[numplayers].numclothes)
+ for (int i = 0; i < player[numplayers].numclothes; i++) {
strcpy(player[numplayers].clothes[i], player[0].clothes[i]);
- player[numplayers].clothestintr[i]=player[0].clothestintr[i];
- player[numplayers].clothestintg[i]=player[0].clothestintg[i];
- player[numplayers].clothestintb[i]=player[0].clothestintb[i];
- tintr=player[numplayers].clothestintr[i];
- tintg=player[numplayers].clothestintg[i];
- tintb=player[numplayers].clothestintb[i];
- AddClothes((char *)player[numplayers].clothes[i],&player[numplayers].skeleton.skinText[0]);
+ player[numplayers].clothestintr[i] = player[0].clothestintr[i];
+ player[numplayers].clothestintg[i] = player[0].clothestintg[i];
+ player[numplayers].clothestintb[i] = player[0].clothestintb[i];
+ tintr = player[numplayers].clothestintr[i];
+ tintg = player[numplayers].clothestintg[i];
+ tintb = player[numplayers].clothestintb[i];
+ AddClothes((char *)player[numplayers].clothes[i], &player[numplayers].skeleton.skinText[0]);
}
- if(player[numplayers].numclothes){
+ if (player[numplayers].numclothes) {
player[numplayers].DoMipmaps();
}
- player[numplayers].power=player[0].power;
- player[numplayers].speedmult=player[0].speedmult;
-
- player[numplayers].damage=0;
- player[numplayers].permanentdamage=0;
- player[numplayers].superpermanentdamage=0;
- player[numplayers].deathbleeding=0;
- player[numplayers].bleeding=0;
- player[numplayers].numwaypoints=0;
- player[numplayers].waypoint=0;
- player[numplayers].jumppath=0;
- player[numplayers].weaponstuck=-1;
- player[numplayers].weaponactive=-1;
- player[numplayers].num_weapons=0;
- player[numplayers].bloodloss=0;
- player[numplayers].dead=0;
-
- player[numplayers].loaded=1;
+ player[numplayers].power = player[0].power;
+ player[numplayers].speedmult = player[0].speedmult;
+
+ player[numplayers].damage = 0;
+ player[numplayers].permanentdamage = 0;
+ player[numplayers].superpermanentdamage = 0;
+ player[numplayers].deathbleeding = 0;
+ player[numplayers].bleeding = 0;
+ player[numplayers].numwaypoints = 0;
+ player[numplayers].waypoint = 0;
+ player[numplayers].jumppath = 0;
+ player[numplayers].weaponstuck = -1;
+ player[numplayers].weaponactive = -1;
+ player[numplayers].num_weapons = 0;
+ player[numplayers].bloodloss = 0;
+ player[numplayers].dead = 0;
+
+ player[numplayers].loaded = 1;
numplayers++;
}
}
- if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LSHIFT)){
- if(player[numplayers-1].numwaypoints<90){
- player[numplayers-1].waypoints[player[numplayers-1].numwaypoints]=player[0].coords;
- player[numplayers-1].waypointtype[player[numplayers-1].numwaypoints]=editorpathtype;
- player[numplayers-1].numwaypoints++;
+ if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LSHIFT)) {
+ if (player[numplayers - 1].numwaypoints < 90) {
+ player[numplayers - 1].waypoints[player[numplayers - 1].numwaypoints] = player[0].coords;
+ player[numplayers - 1].waypointtype[player[numplayers - 1].numwaypoints] = editorpathtype;
+ player[numplayers - 1].numwaypoints++;
}
}
- if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LCTRL)){
- if(numpathpoints<30){
- bool connected,alreadyconnected;
- connected=0;
- if(numpathpoints>1)
- for(int i=0;i<numpathpoints;i++){
- if(distsq(&pathpoint[i],&player[0].coords)<.5&&i!=pathpointselected&&!connected){
- alreadyconnected=0;
- for(int j=0;j<numpathpointconnect[pathpointselected];j++){
- if(pathpointconnect[pathpointselected][j]==i)alreadyconnected=1;
+ if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LCTRL)) {
+ if (numpathpoints < 30) {
+ bool connected, alreadyconnected;
+ connected = 0;
+ if (numpathpoints > 1)
+ for (int i = 0; i < numpathpoints; i++) {
+ if (distsq(&pathpoint[i], &player[0].coords) < .5 && i != pathpointselected && !connected) {
+ alreadyconnected = 0;
+ for (int j = 0; j < numpathpointconnect[pathpointselected]; j++) {
+ if (pathpointconnect[pathpointselected][j] == i)alreadyconnected = 1;
}
- if(!alreadyconnected){
+ if (!alreadyconnected) {
numpathpointconnect[pathpointselected]++;
- connected=1;
- pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected]-1]=i;
+ connected = 1;
+ pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected] - 1] = i;
}
}
}
- if(!connected){
+ if (!connected) {
numpathpoints++;
- pathpoint[numpathpoints-1]=player[0].coords;
- numpathpointconnect[numpathpoints-1]=0;
- if(numpathpoints>1&&pathpointselected!=-1){
+ pathpoint[numpathpoints - 1] = player[0].coords;
+ numpathpointconnect[numpathpoints - 1] = 0;
+ if (numpathpoints > 1 && pathpointselected != -1) {
numpathpointconnect[pathpointselected]++;
- pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected]-1]=numpathpoints-1;
+ pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected] - 1] = numpathpoints - 1;
}
- pathpointselected=numpathpoints-1;
+ pathpointselected = numpathpoints - 1;
}
}
}
- if(Input::isKeyPressed(SDLK_PERIOD)){
+ if (Input::isKeyPressed(SDLK_PERIOD)) {
pathpointselected++;
- if(pathpointselected>=numpathpoints)
- pathpointselected=-1;
+ if (pathpointselected >= numpathpoints)
+ pathpointselected = -1;
}
- if(Input::isKeyPressed(SDLK_COMMA)&&!Input::isKeyDown(SDLK_LSHIFT)){
+ if (Input::isKeyPressed(SDLK_COMMA) && !Input::isKeyDown(SDLK_LSHIFT)) {
pathpointselected--;
- if(pathpointselected<=-2)
- pathpointselected=numpathpoints-1;
+ if (pathpointselected <= -2)
+ pathpointselected = numpathpoints - 1;
}
- if(Input::isKeyPressed(SDLK_COMMA)&&Input::isKeyDown(SDLK_LSHIFT)){
- if(pathpointselected!=-1){
+ if (Input::isKeyPressed(SDLK_COMMA) && Input::isKeyDown(SDLK_LSHIFT)) {
+ if (pathpointselected != -1) {
numpathpoints--;
- pathpoint[pathpointselected]=pathpoint[numpathpoints];
- numpathpointconnect[pathpointselected]=numpathpointconnect[numpathpoints];
- for(int i=0;i<numpathpointconnect[pathpointselected];i++){
- pathpointconnect[pathpointselected][i]=pathpointconnect[numpathpoints][i];
+ pathpoint[pathpointselected] = pathpoint[numpathpoints];
+ numpathpointconnect[pathpointselected] = numpathpointconnect[numpathpoints];
+ for (int i = 0; i < numpathpointconnect[pathpointselected]; i++) {
+ pathpointconnect[pathpointselected][i] = pathpointconnect[numpathpoints][i];
}
- for(int i=0;i<numpathpoints;i++){
- for(int j=0;j<numpathpointconnect[i];j++){
- if(pathpointconnect[i][j]==pathpointselected){
- pathpointconnect[i][j]=pathpointconnect[i][numpathpointconnect[i]-1];
+ for (int i = 0; i < numpathpoints; i++) {
+ for (int j = 0; j < numpathpointconnect[i]; j++) {
+ if (pathpointconnect[i][j] == pathpointselected) {
+ pathpointconnect[i][j] = pathpointconnect[i][numpathpointconnect[i] - 1];
numpathpointconnect[i]--;
}
- if(pathpointconnect[i][j]==numpathpoints){
- pathpointconnect[i][j]=pathpointselected;
+ if (pathpointconnect[i][j] == numpathpoints) {
+ pathpointconnect[i][j] = pathpointselected;
}
}
}
- pathpointselected=numpathpoints-1;
+ pathpointselected = numpathpoints - 1;
}
}
- if(Input::isKeyPressed(SDLK_LEFT)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
+ if (Input::isKeyPressed(SDLK_LEFT) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
editortype--;
- if(editortype==treeleavestype||editortype==10)editortype--;
- if(editortype<0)editortype=firetype;
+ if (editortype == treeleavestype || editortype == 10)editortype--;
+ if (editortype < 0)editortype = firetype;
}
- if(Input::isKeyPressed(SDLK_RIGHT)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
+ if (Input::isKeyPressed(SDLK_RIGHT) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
editortype++;
- if(editortype==treeleavestype||editortype==10)editortype++;
- if(editortype>firetype)editortype=0;
+ if (editortype == treeleavestype || editortype == 10)editortype++;
+ if (editortype > firetype)editortype = 0;
}
- if(Input::isKeyDown(SDLK_LEFT)&&!Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
- editoryaw-=multiplier*100;
- if(editoryaw<-.01)editoryaw=-.01;
+ if (Input::isKeyDown(SDLK_LEFT) && !Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
+ editoryaw -= multiplier * 100;
+ if (editoryaw < -.01)editoryaw = -.01;
}
- if(Input::isKeyDown(SDLK_RIGHT)&&!Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
- editoryaw+=multiplier*100;
+ if (Input::isKeyDown(SDLK_RIGHT) && !Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
+ editoryaw += multiplier * 100;
}
- if(Input::isKeyDown(SDLK_UP)&&!Input::isKeyDown(SDLK_LCTRL)){
- editorsize+=multiplier;
+ if (Input::isKeyDown(SDLK_UP) && !Input::isKeyDown(SDLK_LCTRL)) {
+ editorsize += multiplier;
}
- if(Input::isKeyDown(SDLK_DOWN)&&!Input::isKeyDown(SDLK_LCTRL)){
- editorsize-=multiplier;
- if(editorsize<.1)editorsize=.1;
+ if (Input::isKeyDown(SDLK_DOWN) && !Input::isKeyDown(SDLK_LCTRL)) {
+ editorsize -= multiplier;
+ if (editorsize < .1)editorsize = .1;
}
- if(Input::isKeyPressed(SDLK_LEFT)&&Input::isKeyDown(SDLK_LSHIFT)&&Input::isKeyDown(SDLK_LCTRL)){
- mapradius-=multiplier*10;
+ if (Input::isKeyPressed(SDLK_LEFT) && Input::isKeyDown(SDLK_LSHIFT) && Input::isKeyDown(SDLK_LCTRL)) {
+ mapradius -= multiplier * 10;
}
- if(Input::isKeyPressed(SDLK_RIGHT)&&Input::isKeyDown(SDLK_LSHIFT)&&Input::isKeyDown(SDLK_LCTRL)){
- mapradius+=multiplier*10;
+ if (Input::isKeyPressed(SDLK_RIGHT) && Input::isKeyDown(SDLK_LSHIFT) && Input::isKeyDown(SDLK_LCTRL)) {
+ mapradius += multiplier * 10;
}
- if(Input::isKeyDown(SDLK_UP)&&Input::isKeyDown(SDLK_LCTRL)){
- editorpitch+=multiplier*100;
+ if (Input::isKeyDown(SDLK_UP) && Input::isKeyDown(SDLK_LCTRL)) {
+ editorpitch += multiplier * 100;
}
- if(Input::isKeyDown(SDLK_DOWN)&&Input::isKeyDown(SDLK_LCTRL)){
- editorpitch-=multiplier*100;
- if(editorpitch<-.01)editorpitch=-.01;
+ if (Input::isKeyDown(SDLK_DOWN) && Input::isKeyDown(SDLK_LCTRL)) {
+ editorpitch -= multiplier * 100;
+ if (editorpitch < -.01)editorpitch = -.01;
}
- if(Input::isKeyPressed(SDLK_DELETE)&&objects.numobjects&&Input::isKeyDown(SDLK_LSHIFT)){
- int closest=findClosestObject();
- if(closest>=0)
+ if (Input::isKeyPressed(SDLK_DELETE) && objects.numobjects && Input::isKeyDown(SDLK_LSHIFT)) {
+ int closest = findClosestObject();
+ if (closest >= 0)
objects.DeleteObject(closest);
}
}
}
}
-void doJumpReversals(){
- for(int k=0;k<numplayers;k++)
- for(int i=k;i<numplayers;i++){
- if(i==k)continue;
- if( player[k].skeleton.free==0&&
- player[i].skeleton.oldfree==0&&
- (player[i].animTarget==jumpupanim||
- player[k].animTarget==jumpupanim)&&
- (player[i].aitype==playercontrolled||
- player[k].aitype==playercontrolled)&&
- (player[i].aitype==attacktypecutoff&&player[i].stunned<=0||
- player[k].aitype==attacktypecutoff&&player[k].stunned<=0)){
- if( distsq(&player[i].coords,&player[k].coords)<10*sq((player[i].scale+player[k].scale)*2.5)&&
- distsqflat(&player[i].coords,&player[k].coords)<2*sq((player[i].scale+player[k].scale)*2.5)){
+void doJumpReversals()
+{
+ for (int k = 0; k < numplayers; k++)
+ for (int i = k; i < numplayers; i++) {
+ if (i == k)continue;
+ if ( player[k].skeleton.free == 0 &&
+ player[i].skeleton.oldfree == 0 &&
+ (player[i].animTarget == jumpupanim ||
+ player[k].animTarget == jumpupanim) &&
+ (player[i].aitype == playercontrolled ||
+ player[k].aitype == playercontrolled) &&
+ (player[i].aitype == attacktypecutoff && player[i].stunned <= 0 ||
+ player[k].aitype == attacktypecutoff && player[k].stunned <= 0)) {
+ if ( distsq(&player[i].coords, &player[k].coords) < 10 * sq((player[i].scale + player[k].scale) * 2.5) &&
+ distsqflat(&player[i].coords, &player[k].coords) < 2 * sq((player[i].scale + player[k].scale) * 2.5)) {
//TODO: refactor two huge similar ifs
- if(player[i].animTarget==jumpupanim&&
- player[k].animTarget!=getupfrombackanim&&
- player[k].animTarget!=getupfromfrontanim&&
- animation[player[k].animTarget].height==middleheight&&
- normaldotproduct(player[i].velocity,player[k].coords-player[i].coords)<0&&
- (player[k].aitype==playercontrolled&&player[k].attackkeydown||
- player[k].aitype!=playercontrolled)){
- player[i].victim=&player[k];
- player[i].velocity=0;
- player[i].animCurrent=jumpreversedanim;
- player[i].animTarget=jumpreversedanim;
- player[i].frameCurrent=0;
- player[i].frameTarget=1;
- player[i].targettilt2=0;
- player[k].victim=&player[i];
- player[k].velocity=0;
- player[k].animCurrent=jumpreversalanim;
- player[k].animTarget=jumpreversalanim;
- player[k].frameCurrent=0;
- player[k].frameTarget=1;
- player[k].targettilt2=0;
- if(player[i].coords.y<player[k].coords.y+1){
- player[i].animCurrent=rabbitkickreversedanim;
- player[i].animTarget=rabbitkickreversedanim;
- player[i].frameCurrent=1;
- player[i].frameTarget=2;
- player[k].animCurrent=rabbitkickreversalanim;
- player[k].animTarget=rabbitkickreversalanim;
- player[k].frameCurrent=1;
- player[k].frameTarget=2;
+ if (player[i].animTarget == jumpupanim &&
+ player[k].animTarget != getupfrombackanim &&
+ player[k].animTarget != getupfromfrontanim &&
+ animation[player[k].animTarget].height == middleheight &&
+ normaldotproduct(player[i].velocity, player[k].coords - player[i].coords) < 0 &&
+ (player[k].aitype == playercontrolled && player[k].attackkeydown ||
+ player[k].aitype != playercontrolled)) {
+ player[i].victim = &player[k];
+ player[i].velocity = 0;
+ player[i].animCurrent = jumpreversedanim;
+ player[i].animTarget = jumpreversedanim;
+ player[i].frameCurrent = 0;
+ player[i].frameTarget = 1;
+ player[i].targettilt2 = 0;
+ player[k].victim = &player[i];
+ player[k].velocity = 0;
+ player[k].animCurrent = jumpreversalanim;
+ player[k].animTarget = jumpreversalanim;
+ player[k].frameCurrent = 0;
+ player[k].frameTarget = 1;
+ player[k].targettilt2 = 0;
+ if (player[i].coords.y < player[k].coords.y + 1) {
+ player[i].animCurrent = rabbitkickreversedanim;
+ player[i].animTarget = rabbitkickreversedanim;
+ player[i].frameCurrent = 1;
+ player[i].frameTarget = 2;
+ player[k].animCurrent = rabbitkickreversalanim;
+ player[k].animTarget = rabbitkickreversalanim;
+ player[k].frameCurrent = 1;
+ player[k].frameTarget = 2;
}
- player[i].target=0;
- player[k].oldcoords=player[k].coords;
- player[i].coords=player[k].coords;
- player[k].targetyaw=player[i].targetyaw;
- player[k].yaw=player[i].targetyaw;
- if(player[k].aitype==attacktypecutoff)
- player[k].stunned=.5;
+ player[i].target = 0;
+ player[k].oldcoords = player[k].coords;
+ player[i].coords = player[k].coords;
+ player[k].targetyaw = player[i].targetyaw;
+ player[k].yaw = player[i].targetyaw;
+ if (player[k].aitype == attacktypecutoff)
+ player[k].stunned = .5;
}
- if(player[k].animTarget==jumpupanim&&
- player[i].animTarget!=getupfrombackanim&&
- player[i].animTarget!=getupfromfrontanim&&
- animation[player[i].animTarget].height==middleheight&&
- normaldotproduct(player[k].velocity,player[i].coords-player[k].coords)<0&&
- ((player[i].aitype==playercontrolled&&player[i].attackkeydown)||
- player[i].aitype!=playercontrolled)){
- player[k].victim=&player[i];
- player[k].velocity=0;
- player[k].animCurrent=jumpreversedanim;
- player[k].animTarget=jumpreversedanim;
- player[k].frameCurrent=0;
- player[k].frameTarget=1;
- player[k].targettilt2=0;
- player[i].victim=&player[k];
- player[i].velocity=0;
- player[i].animCurrent=jumpreversalanim;
- player[i].animTarget=jumpreversalanim;
- player[i].frameCurrent=0;
- player[i].frameTarget=1;
- player[i].targettilt2=0;
- if(player[k].coords.y<player[i].coords.y+1){
- player[k].animTarget=rabbitkickreversedanim;
- player[k].animCurrent=rabbitkickreversedanim;
- player[i].animCurrent=rabbitkickreversalanim;
- player[i].animTarget=rabbitkickreversalanim;
- player[k].frameCurrent=1;
- player[k].frameTarget=2;
- player[i].frameCurrent=1;
- player[i].frameTarget=2;
+ if (player[k].animTarget == jumpupanim &&
+ player[i].animTarget != getupfrombackanim &&
+ player[i].animTarget != getupfromfrontanim &&
+ animation[player[i].animTarget].height == middleheight &&
+ normaldotproduct(player[k].velocity, player[i].coords - player[k].coords) < 0 &&
+ ((player[i].aitype == playercontrolled && player[i].attackkeydown) ||
+ player[i].aitype != playercontrolled)) {
+ player[k].victim = &player[i];
+ player[k].velocity = 0;
+ player[k].animCurrent = jumpreversedanim;
+ player[k].animTarget = jumpreversedanim;
+ player[k].frameCurrent = 0;
+ player[k].frameTarget = 1;
+ player[k].targettilt2 = 0;
+ player[i].victim = &player[k];
+ player[i].velocity = 0;
+ player[i].animCurrent = jumpreversalanim;
+ player[i].animTarget = jumpreversalanim;
+ player[i].frameCurrent = 0;
+ player[i].frameTarget = 1;
+ player[i].targettilt2 = 0;
+ if (player[k].coords.y < player[i].coords.y + 1) {
+ player[k].animTarget = rabbitkickreversedanim;
+ player[k].animCurrent = rabbitkickreversedanim;
+ player[i].animCurrent = rabbitkickreversalanim;
+ player[i].animTarget = rabbitkickreversalanim;
+ player[k].frameCurrent = 1;
+ player[k].frameTarget = 2;
+ player[i].frameCurrent = 1;
+ player[i].frameTarget = 2;
}
- player[k].target=0;
- player[i].oldcoords=player[i].coords;
- player[k].coords=player[i].coords;
- player[i].targetyaw=player[k].targetyaw;
- player[i].yaw=player[k].targetyaw;
- if(player[i].aitype==attacktypecutoff)
- player[i].stunned=.5;
+ player[k].target = 0;
+ player[i].oldcoords = player[i].coords;
+ player[k].coords = player[i].coords;
+ player[i].targetyaw = player[k].targetyaw;
+ player[i].yaw = player[k].targetyaw;
+ if (player[i].aitype == attacktypecutoff)
+ player[i].stunned = .5;
}
}
}
}
}
-void doAerialAcrobatics(){
- static XYZ facing,flatfacing;
- for(int k=0;k<numplayers;k++){
- player[k].turnspeed=500;
-
- if((player[k].isRun()&&
- ((player[k].targetyaw!=rabbitrunninganim&&
- player[k].targetyaw!=wolfrunninganim)||
- player[k].frameTarget==4))||
- player[k].animTarget==removeknifeanim||
- player[k].animTarget==crouchremoveknifeanim||
- player[k].animTarget==flipanim||
- player[k].animTarget==fightsidestep||
- player[k].animTarget==walkanim){
- player[k].yaw=stepTowardf(player[k].yaw, player[k].targetyaw, multiplier*player[k].turnspeed);
+void doAerialAcrobatics()
+{
+ static XYZ facing, flatfacing;
+ for (int k = 0; k < numplayers; k++) {
+ player[k].turnspeed = 500;
+
+ if ((player[k].isRun() &&
+ ((player[k].targetyaw != rabbitrunninganim &&
+ player[k].targetyaw != wolfrunninganim) ||
+ player[k].frameTarget == 4)) ||
+ player[k].animTarget == removeknifeanim ||
+ player[k].animTarget == crouchremoveknifeanim ||
+ player[k].animTarget == flipanim ||
+ player[k].animTarget == fightsidestep ||
+ player[k].animTarget == walkanim) {
+ player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed);
}
- if(player[k].isStop()||
- player[k].isLanding()||
- player[k].animTarget==staggerbackhighanim||
- (player[k].animTarget==sneakanim&&player[k].animCurrent==sneakanim)||
- player[k].animTarget==staggerbackhardanim||
- player[k].animTarget==backhandspringanim||
- player[k].animTarget==dodgebackanim||
- player[k].animTarget==rollanim||
- (animation[player[k].animTarget].attack&&
- player[k].animTarget!=rabbitkickanim&&
- (player[k].animTarget!=crouchstabanim||player[k].hasvictim)&&
- (player[k].animTarget!=swordgroundstabanim||player[k].hasvictim))){
- player[k].yaw=stepTowardf(player[k].yaw, player[k].targetyaw, multiplier*player[k].turnspeed*2);
+ if (player[k].isStop() ||
+ player[k].isLanding() ||
+ player[k].animTarget == staggerbackhighanim ||
+ (player[k].animTarget == sneakanim && player[k].animCurrent == sneakanim) ||
+ player[k].animTarget == staggerbackhardanim ||
+ player[k].animTarget == backhandspringanim ||
+ player[k].animTarget == dodgebackanim ||
+ player[k].animTarget == rollanim ||
+ (animation[player[k].animTarget].attack &&
+ player[k].animTarget != rabbitkickanim &&
+ (player[k].animTarget != crouchstabanim || player[k].hasvictim) &&
+ (player[k].animTarget != swordgroundstabanim || player[k].hasvictim))) {
+ player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed * 2);
}
- if(player[k].animTarget==sneakanim&&player[k].animCurrent!=sneakanim){
- player[k].yaw=stepTowardf(player[k].yaw, player[k].targetyaw, multiplier*player[k].turnspeed*4);
+ if (player[k].animTarget == sneakanim && player[k].animCurrent != sneakanim) {
+ player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed * 4);
}
/*if(player[k].aitype!=passivetype||(distsq(&player[k].coords,&viewer)<viewdistance*viewdistance))*/
player[k].DoStuff();
- if(player[k].immobile&&k!=0)
- player[k].coords=player[k].realoldcoords;
+ if (player[k].immobile && k != 0)
+ player[k].coords = player[k].realoldcoords;
//if player's position has changed (?)
- if(distsq(&player[k].coords,&player[k].realoldcoords)>0&&
- !player[k].skeleton.free&&
- player[k].animTarget!=climbanim&&
- player[k].animTarget!=hanganim){
- XYZ lowpoint,lowpointtarget,lowpoint2,lowpointtarget2,lowpoint3,lowpointtarget3,lowpoint4,lowpointtarget4,lowpoint5,lowpointtarget5,lowpoint6,lowpointtarget6,lowpoint7,lowpointtarget7,colpoint,colpoint2;
+ if (distsq(&player[k].coords, &player[k].realoldcoords) > 0 &&
+ !player[k].skeleton.free &&
+ player[k].animTarget != climbanim &&
+ player[k].animTarget != hanganim) {
+ XYZ lowpoint, lowpointtarget, lowpoint2, lowpointtarget2, lowpoint3, lowpointtarget3, lowpoint4, lowpointtarget4, lowpoint5, lowpointtarget5, lowpoint6, lowpointtarget6, lowpoint7, lowpointtarget7, colpoint, colpoint2;
int whichhit;
- bool tempcollide=0;
+ bool tempcollide = 0;
- if(player[k].collide<-.3)
- player[k].collide=-.3;
- if(player[k].collide>1)
- player[k].collide=1;
- player[k].collide-=multiplier*30;
+ if (player[k].collide < -.3)
+ player[k].collide = -.3;
+ if (player[k].collide > 1)
+ player[k].collide = 1;
+ player[k].collide -= multiplier * 30;
//clip to terrain
- player[k].coords.y=max(player[k].coords.y, terrain.getHeight(player[k].coords.x,player[k].coords.z));
-
- for(int l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
- int i=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- if(objects.type[i]!=rocktype||
- objects.scale[i]>.5&&player[k].aitype==playercontrolled||
- objects.position[i].y>player[k].coords.y){
- lowpoint=player[k].coords;
- if(player[k].animTarget!=jumpupanim&&
- player[k].animTarget!=jumpdownanim&&
+ player[k].coords.y = max(player[k].coords.y, terrain.getHeight(player[k].coords.x, player[k].coords.z));
+
+ for (int l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+ int i = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+ if (objects.type[i] != rocktype ||
+ objects.scale[i] > .5 && player[k].aitype == playercontrolled ||
+ objects.position[i].y > player[k].coords.y) {
+ lowpoint = player[k].coords;
+ if (player[k].animTarget != jumpupanim &&
+ player[k].animTarget != jumpdownanim &&
!player[k].isFlip())
- lowpoint.y+=1.25;
+ lowpoint.y += 1.25;
else
- lowpoint.y+=1.3;
- if( player[k].coords.y<terrain.getHeight(player[k].coords.x,player[k].coords.z)&&
- player[k].coords.y>terrain.getHeight(player[k].coords.x,player[k].coords.z)-.1)
- player[k].coords.y=terrain.getHeight(player[k].coords.x,player[k].coords.z);
- if(player[k].SphereCheck(&lowpoint, 1.3, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i])!=-1){
- flatfacing=lowpoint-player[k].coords;
- player[k].coords=lowpoint;
- player[k].coords.y-=1.3;
- player[k].collide=1;
- tempcollide=1;
+ lowpoint.y += 1.3;
+ if ( player[k].coords.y < terrain.getHeight(player[k].coords.x, player[k].coords.z) &&
+ player[k].coords.y > terrain.getHeight(player[k].coords.x, player[k].coords.z) - .1)
+ player[k].coords.y = terrain.getHeight(player[k].coords.x, player[k].coords.z);
+ if (player[k].SphereCheck(&lowpoint, 1.3, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) {
+ flatfacing = lowpoint - player[k].coords;
+ player[k].coords = lowpoint;
+ player[k].coords.y -= 1.3;
+ player[k].collide = 1;
+ tempcollide = 1;
//wall jumps
//TODO: refactor four similar blocks
- if(player[k].aitype==playercontrolled&&
- (player[k].animTarget==jumpupanim||
- player[k].animTarget==jumpdownanim||
- player[k].isFlip())&&
- !player[k].jumptogglekeydown&&
- player[k].jumpkeydown){
- lowpointtarget=lowpoint+DoRotation(player[k].facing,0,-90,0)*1.5;
- XYZ tempcoords1=lowpoint;
- whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
- if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
+ if (player[k].aitype == playercontrolled &&
+ (player[k].animTarget == jumpupanim ||
+ player[k].animTarget == jumpdownanim ||
+ player[k].isFlip()) &&
+ !player[k].jumptogglekeydown &&
+ player[k].jumpkeydown) {
+ lowpointtarget = lowpoint + DoRotation(player[k].facing, 0, -90, 0) * 1.5;
+ XYZ tempcoords1 = lowpoint;
+ whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+ if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
player[k].setAnimation(walljumpleftanim);
emit_sound_at(movewhooshsound, player[k].coords);
- if(k==0)
+ if (k == 0)
pause_sound(whooshsound);
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
- player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)
- player[k].yaw=180-player[k].yaw;
- player[k].targetyaw=player[k].yaw;
- player[k].lowyaw=player[k].yaw;
- if(k==0)
+ lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+ player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+ if (lowpointtarget.z < 0)
+ player[k].yaw = 180 - player[k].yaw;
+ player[k].targetyaw = player[k].yaw;
+ player[k].lowyaw = player[k].yaw;
+ if (k == 0)
numwallflipped++;
- }
- else
- {
- lowpoint=tempcoords1;
- lowpointtarget=lowpoint+DoRotation(player[k].facing,0,90,0)*1.5;
- whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
- if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
+ } else {
+ lowpoint = tempcoords1;
+ lowpointtarget = lowpoint + DoRotation(player[k].facing, 0, 90, 0) * 1.5;
+ whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+ if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
player[k].setAnimation(walljumprightanim);
emit_sound_at(movewhooshsound, player[k].coords);
- if(k==0)pause_sound(whooshsound);
-
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
- player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)player[k].yaw=180-player[k].yaw;
- player[k].targetyaw=player[k].yaw;
- player[k].lowyaw=player[k].yaw;
- if(k==0)numwallflipped++;
- }
- else
- {
- lowpoint=tempcoords1;
- lowpointtarget=lowpoint+player[k].facing*2;
- whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
- if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
+ if (k == 0)pause_sound(whooshsound);
+
+ lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+ player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+ if (lowpointtarget.z < 0)player[k].yaw = 180 - player[k].yaw;
+ player[k].targetyaw = player[k].yaw;
+ player[k].lowyaw = player[k].yaw;
+ if (k == 0)numwallflipped++;
+ } else {
+ lowpoint = tempcoords1;
+ lowpointtarget = lowpoint + player[k].facing * 2;
+ whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+ if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
player[k].setAnimation(walljumpbackanim);
emit_sound_at(movewhooshsound, player[k].coords);
- if(k==0)pause_sound(whooshsound);
-
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
- player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)player[k].yaw=180-player[k].yaw;
- player[k].targetyaw=player[k].yaw;
- player[k].lowyaw=player[k].yaw;
- if(k==0)numwallflipped++;
- }
- else
- {
- lowpoint=tempcoords1;
- lowpointtarget=lowpoint-player[k].facing*2;
- whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
- if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
+ if (k == 0)pause_sound(whooshsound);
+
+ lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+ player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+ if (lowpointtarget.z < 0)player[k].yaw = 180 - player[k].yaw;
+ player[k].targetyaw = player[k].yaw;
+ player[k].lowyaw = player[k].yaw;
+ if (k == 0)numwallflipped++;
+ } else {
+ lowpoint = tempcoords1;
+ lowpointtarget = lowpoint - player[k].facing * 2;
+ whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+ if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
player[k].setAnimation(walljumpfrontanim);
emit_sound_at(movewhooshsound, player[k].coords);
- if(k==0)pause_sound(whooshsound);
-
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
- player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)player[k].yaw=180-player[k].yaw;
- player[k].yaw+=180;
- player[k].targetyaw=player[k].yaw;
- player[k].lowyaw=player[k].yaw;
- if(k==0)numwallflipped++;
+ if (k == 0)pause_sound(whooshsound);
+
+ lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+ player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+ if (lowpointtarget.z < 0)player[k].yaw = 180 - player[k].yaw;
+ player[k].yaw += 180;
+ player[k].targetyaw = player[k].yaw;
+ player[k].lowyaw = player[k].yaw;
+ if (k == 0)numwallflipped++;
}
}
}
}
}
}
- }
- else if(objects.type[i]==rocktype){
- lowpoint2=player[k].coords;
- lowpoint=player[k].coords;
- lowpoint.y+=2;
- if(objects.model[i].LineCheck(&lowpoint,&lowpoint2,&colpoint,&objects.position[i],&objects.yaw[i])!=-1){
- player[k].coords=colpoint;
- player[k].collide=1;
- tempcollide=1;
-
- if(player[k].animTarget==jumpdownanim||player[k].isFlip()){
+ } else if (objects.type[i] == rocktype) {
+ lowpoint2 = player[k].coords;
+ lowpoint = player[k].coords;
+ lowpoint.y += 2;
+ if (objects.model[i].LineCheck(&lowpoint, &lowpoint2, &colpoint, &objects.position[i], &objects.yaw[i]) != -1) {
+ player[k].coords = colpoint;
+ player[k].collide = 1;
+ tempcollide = 1;
+
+ if (player[k].animTarget == jumpdownanim || player[k].isFlip()) {
//flipped into a rock
- if(player[k].isFlip()&&animation[player[k].animTarget].label[player[k].frameTarget]==7)
+ if (player[k].isFlip() && animation[player[k].animTarget].label[player[k].frameTarget] == 7)
player[k].RagDoll(0);
- if(player[k].animTarget==jumpupanim){
- player[k].jumppower=-4;
- player[k].animTarget=player[k].getIdle();
+ if (player[k].animTarget == jumpupanim) {
+ player[k].jumppower = -4;
+ player[k].animTarget = player[k].getIdle();
}
- player[k].target=0;
- player[k].frameTarget=0;
- player[k].onterrain=1;
+ player[k].target = 0;
+ player[k].frameTarget = 0;
+ player[k].onterrain = 1;
- if(player[k].id==0){
+ if (player[k].id == 0) {
pause_sound(whooshsound);
OPENAL_SetVolume(channels[whooshsound], 0);
}
//landing
- if((player[k].animTarget==jumpdownanim||player[k].isFlip())&&!player[k].wasLanding()){
- if(player[k].isFlip())
- player[k].jumppower=-4;
- player[k].animTarget=player[k].getLanding();
+ if ((player[k].animTarget == jumpdownanim || player[k].isFlip()) && !player[k].wasLanding()) {
+ if (player[k].isFlip())
+ player[k].jumppower = -4;
+ player[k].animTarget = player[k].getLanding();
emit_sound_at(landsound, player[k].coords, 128.);
- if(k==0){
- envsound[numenvsounds]=player[k].coords;
- envsoundvol[numenvsounds]=16;
- envsoundlife[numenvsounds]=.4;
+ if (k == 0) {
+ envsound[numenvsounds] = player[k].coords;
+ envsoundvol[numenvsounds] = 16;
+ envsoundlife[numenvsounds] = .4;
numenvsounds++;
}
}
}
- if(tempcollide&&(/*player[k].jumptogglekeydown*/1==1||player[k].aitype!=playercontrolled))
- for(int l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
- int i=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- lowpoint=player[k].coords;
- lowpoint.y+=1.35;
- if(objects.type[i]!=rocktype)
- if(player[k].SphereCheck(&lowpoint,1.33,&colpoint,&objects.position[i],&objects.yaw[i],&objects.model[i])!=-1){
- if(player[k].animTarget!=jumpupanim&&
- player[k].animTarget!=jumpdownanim&&
+ if (tempcollide && (/*player[k].jumptogglekeydown*/1 == 1 || player[k].aitype != playercontrolled))
+ for (int l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+ int i = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+ lowpoint = player[k].coords;
+ lowpoint.y += 1.35;
+ if (objects.type[i] != rocktype)
+ if (player[k].SphereCheck(&lowpoint, 1.33, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) {
+ if (player[k].animTarget != jumpupanim &&
+ player[k].animTarget != jumpdownanim &&
player[k].onterrain)
- player[k].avoidcollided=1;
- player[k].coords=lowpoint;
- player[k].coords.y-=1.35;
- player[k].collide=1;
-
- if((player[k].grabdelay<=0||player[k].aitype!=playercontrolled)&&
- (player[k].animCurrent!=climbanim&&
- player[k].animCurrent!=hanganim&&
- !player[k].isWallJump()||
- player[k].animTarget==jumpupanim||
- player[k].animTarget==jumpdownanim)){
- lowpoint=player[k].coords;
+ player[k].avoidcollided = 1;
+ player[k].coords = lowpoint;
+ player[k].coords.y -= 1.35;
+ player[k].collide = 1;
+
+ if ((player[k].grabdelay <= 0 || player[k].aitype != playercontrolled) &&
+ (player[k].animCurrent != climbanim &&
+ player[k].animCurrent != hanganim &&
+ !player[k].isWallJump() ||
+ player[k].animTarget == jumpupanim ||
+ player[k].animTarget == jumpdownanim)) {
+ lowpoint = player[k].coords;
objects.model[i].SphereCheckPossible(&lowpoint, 1.5, &objects.position[i], &objects.yaw[i]);
- lowpoint=player[k].coords;
- lowpoint.y+=.05;
- facing=0;
- facing.z=-1;
- facing=DoRotation(facing,0,player[k].targetyaw+180,0);
- lowpointtarget=lowpoint+facing*1.4;
- whichhit=objects.model[i].LineCheckPossible(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
- if(whichhit!=-1){
- lowpoint=player[k].coords;
- lowpoint.y+=.1;
- lowpointtarget=lowpoint+facing*1.4;
- lowpoint2=lowpoint;
- lowpointtarget2=lowpointtarget;
- lowpoint3=lowpoint;
- lowpointtarget3=lowpointtarget;
- lowpoint4=lowpoint;
- lowpointtarget4=lowpointtarget;
- lowpoint5=lowpoint;
- lowpointtarget5=lowpointtarget;
- lowpoint6=lowpoint;
- lowpointtarget6=lowpointtarget;
- lowpoint7=lowpoint;
- lowpointtarget7=lowpoint;
- lowpoint2.x+=.1;
- lowpointtarget2.x+=.1;
- lowpoint3.z+=.1;
- lowpointtarget3.z+=.1;
- lowpoint4.x-=.1;
- lowpointtarget4.x-=.1;
- lowpoint5.z-=.1;
- lowpointtarget5.z-=.1;
- lowpoint6.y+=45/13;
- lowpointtarget6.y+=45/13;
- lowpointtarget6+=facing*.6;
- lowpointtarget7.y+=90/13;
- whichhit=objects.model[i].LineCheckPossible(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
- if(objects.friction[i]>.5)
- if(whichhit!=-1){
- if(whichhit!=-1&&player[k].animTarget!=jumpupanim&&player[k].animTarget!=jumpdownanim)
- player[k].collided=1;
- if(checkcollide(lowpoint7,lowpointtarget7)==-1)
- if(checkcollide(lowpoint6,lowpointtarget6)==-1)
- if( objects.model[i].LineCheckPossible(&lowpoint2,&lowpointtarget2,
- &colpoint,&objects.position[i],&objects.yaw[i])!=-1&&
- objects.model[i].LineCheckPossible(&lowpoint3,&lowpointtarget3,
- &colpoint,&objects.position[i],&objects.yaw[i])!=-1&&
- objects.model[i].LineCheckPossible(&lowpoint4,&lowpointtarget4,
- &colpoint,&objects.position[i],&objects.yaw[i])!=-1&&
- objects.model[i].LineCheckPossible(&lowpoint5,&lowpointtarget5,
- &colpoint,&objects.position[i],&objects.yaw[i])!=-1)
- for(int j=0;j<45;j++){
- lowpoint=player[k].coords;
- lowpoint.y+=(float)j/13;
- lowpointtarget=lowpoint+facing*1.4;
- if(objects.model[i].LineCheckPossible(&lowpoint,&lowpointtarget,
- &colpoint2,&objects.position[i],&objects.yaw[i])==-1){
- if(j<=6||j<=25&&player[k].animTarget==jumpdownanim)
+ lowpoint = player[k].coords;
+ lowpoint.y += .05;
+ facing = 0;
+ facing.z = -1;
+ facing = DoRotation(facing, 0, player[k].targetyaw + 180, 0);
+ lowpointtarget = lowpoint + facing * 1.4;
+ whichhit = objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+ if (whichhit != -1) {
+ lowpoint = player[k].coords;
+ lowpoint.y += .1;
+ lowpointtarget = lowpoint + facing * 1.4;
+ lowpoint2 = lowpoint;
+ lowpointtarget2 = lowpointtarget;
+ lowpoint3 = lowpoint;
+ lowpointtarget3 = lowpointtarget;
+ lowpoint4 = lowpoint;
+ lowpointtarget4 = lowpointtarget;
+ lowpoint5 = lowpoint;
+ lowpointtarget5 = lowpointtarget;
+ lowpoint6 = lowpoint;
+ lowpointtarget6 = lowpointtarget;
+ lowpoint7 = lowpoint;
+ lowpointtarget7 = lowpoint;
+ lowpoint2.x += .1;
+ lowpointtarget2.x += .1;
+ lowpoint3.z += .1;
+ lowpointtarget3.z += .1;
+ lowpoint4.x -= .1;
+ lowpointtarget4.x -= .1;
+ lowpoint5.z -= .1;
+ lowpointtarget5.z -= .1;
+ lowpoint6.y += 45 / 13;
+ lowpointtarget6.y += 45 / 13;
+ lowpointtarget6 += facing * .6;
+ lowpointtarget7.y += 90 / 13;
+ whichhit = objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+ if (objects.friction[i] > .5)
+ if (whichhit != -1) {
+ if (whichhit != -1 && player[k].animTarget != jumpupanim && player[k].animTarget != jumpdownanim)
+ player[k].collided = 1;
+ if (checkcollide(lowpoint7, lowpointtarget7) == -1)
+ if (checkcollide(lowpoint6, lowpointtarget6) == -1)
+ if ( objects.model[i].LineCheckPossible(&lowpoint2, &lowpointtarget2,
+ &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
+ objects.model[i].LineCheckPossible(&lowpoint3, &lowpointtarget3,
+ &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
+ objects.model[i].LineCheckPossible(&lowpoint4, &lowpointtarget4,
+ &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
+ objects.model[i].LineCheckPossible(&lowpoint5, &lowpointtarget5,
+ &colpoint, &objects.position[i], &objects.yaw[i]) != -1)
+ for (int j = 0; j < 45; j++) {
+ lowpoint = player[k].coords;
+ lowpoint.y += (float)j / 13;
+ lowpointtarget = lowpoint + facing * 1.4;
+ if (objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget,
+ &colpoint2, &objects.position[i], &objects.yaw[i]) == -1) {
+ if (j <= 6 || j <= 25 && player[k].animTarget == jumpdownanim)
break;
- if(player[k].animTarget==jumpupanim||player[k].animTarget==jumpdownanim){
- lowpoint=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[k],0);
- lowpoint=player[k].coords;
- lowpoint.y+=(float)j/13;
- lowpointtarget=lowpoint+facing*1.3;
- flatfacing=player[k].coords;
- player[k].coords=colpoint-DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[k],0)*.01;
- player[k].coords.y=lowpointtarget.y-.07;
- player[k].currentoffset=(flatfacing-player[k].coords)/player[k].scale;
-
- if(j>10||!player[k].isRun()){
- if(player[k].animTarget==jumpdownanim||player[k].animTarget==jumpupanim){
- if(k==0)
+ if (player[k].animTarget == jumpupanim || player[k].animTarget == jumpdownanim) {
+ lowpoint = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0);
+ lowpoint = player[k].coords;
+ lowpoint.y += (float)j / 13;
+ lowpointtarget = lowpoint + facing * 1.3;
+ flatfacing = player[k].coords;
+ player[k].coords = colpoint - DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0) * .01;
+ player[k].coords.y = lowpointtarget.y - .07;
+ player[k].currentoffset = (flatfacing - player[k].coords) / player[k].scale;
+
+ if (j > 10 || !player[k].isRun()) {
+ if (player[k].animTarget == jumpdownanim || player[k].animTarget == jumpupanim) {
+ if (k == 0)
pause_sound(whooshsound);
}
emit_sound_at(jumpsound, player[k].coords, 128.);
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
- player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)
- player[k].yaw=180-player[k].yaw;
- player[k].targetyaw=player[k].yaw;
- player[k].lowyaw=player[k].yaw;
+ lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+ player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+ if (lowpointtarget.z < 0)
+ player[k].yaw = 180 - player[k].yaw;
+ player[k].targetyaw = player[k].yaw;
+ player[k].lowyaw = player[k].yaw;
//player[k].velocity=lowpointtarget*.03;
- player[k].velocity=0;
+ player[k].velocity = 0;
//climb ledge (?)
- if(player[k].animTarget==jumpupanim){
- player[k].animTarget=climbanim;
- player[k].jumppower=0;
- player[k].jumpclimb=1;
+ if (player[k].animTarget == jumpupanim) {
+ player[k].animTarget = climbanim;
+ player[k].jumppower = 0;
+ player[k].jumpclimb = 1;
}
- player[k].transspeed=6;
- player[k].target=0;
- player[k].frameTarget=1;
+ player[k].transspeed = 6;
+ player[k].target = 0;
+ player[k].frameTarget = 1;
//hang ledge (?)
- if(j>25){
+ if (j > 25) {
player[k].setAnimation(hanganim);
- player[k].jumppower=0;
+ player[k].jumppower = 0;
}
}
break;
}
}
}
- if(player[k].collide<=0){
+ if (player[k].collide <= 0) {
//in the air
- if(!player[k].onterrain&&
- player[k].animTarget!=jumpupanim&&
- player[k].animTarget!=jumpdownanim&&
- player[k].animTarget!=climbanim&&
- player[k].animTarget!=hanganim&&
- !player[k].isWallJump()&&
- !player[k].isFlip()){
- if(player[k].animCurrent!=climbanim&&
- player[k].animCurrent!=tempanim&&
- player[k].animTarget!=backhandspringanim&&
- (player[k].animTarget!=rollanim||
- player[k].frameTarget<2||
- player[k].frameTarget>6)){
+ if (!player[k].onterrain &&
+ player[k].animTarget != jumpupanim &&
+ player[k].animTarget != jumpdownanim &&
+ player[k].animTarget != climbanim &&
+ player[k].animTarget != hanganim &&
+ !player[k].isWallJump() &&
+ !player[k].isFlip()) {
+ if (player[k].animCurrent != climbanim &&
+ player[k].animCurrent != tempanim &&
+ player[k].animTarget != backhandspringanim &&
+ (player[k].animTarget != rollanim ||
+ player[k].frameTarget < 2 ||
+ player[k].frameTarget > 6)) {
//stagger off ledge (?)
- if(player[k].animTarget==staggerbackhighanim||player[k].animTarget==staggerbackhardanim)
+ if (player[k].animTarget == staggerbackhighanim || player[k].animTarget == staggerbackhardanim)
player[k].RagDoll(0);
player[k].setAnimation(jumpdownanim);
- if(!k)
- emit_sound_at(whooshsound, player[k].coords, 128.);
+ if (!k)
+ emit_sound_at(whooshsound, player[k].coords, 128.);
}
//gravity
- player[k].velocity.y+=gravity;
+ player[k].velocity.y += gravity;
}
}
}
- player[k].realoldcoords=player[k].coords;
+ player[k].realoldcoords = player[k].coords;
}
}
-void doAttacks(){
+void doAttacks()
+{
static XYZ relative;
static int randattack;
- static bool playerrealattackkeydown=0;
-
- if(!Input::isKeyDown(attackkey))
- oldattackkey=0;
- if(oldattackkey)
- player[0].attackkeydown=0;
- if(oldattackkey)
- playerrealattackkeydown=0;
- if(!oldattackkey)
- playerrealattackkeydown=Input::isKeyDown(attackkey);
- if((player[0].parriedrecently<=0||
- player[0].weaponactive==-1)&&
- (!oldattackkey||
- (realthreat&&
- player[0].lastattack!=swordslashanim&&
- player[0].lastattack!=knifeslashstartanim&&
- player[0].lastattack!=staffhitanim&&
- player[0].lastattack!=staffspinhitanim)))
- player[0].attackkeydown=Input::isKeyDown(attackkey);
- if(Input::isKeyDown(attackkey)&&
- !oldattackkey&&
- !player[0].backkeydown){
- for(int k=0;k<numplayers;k++){
- if((player[k].animTarget==swordslashanim||
- player[k].animTarget==staffhitanim||
- player[k].animTarget==staffspinhitanim)&&
- player[0].animCurrent!=dodgebackanim&&
+ static bool playerrealattackkeydown = 0;
+
+ if (!Input::isKeyDown(attackkey))
+ oldattackkey = 0;
+ if (oldattackkey)
+ player[0].attackkeydown = 0;
+ if (oldattackkey)
+ playerrealattackkeydown = 0;
+ if (!oldattackkey)
+ playerrealattackkeydown = Input::isKeyDown(attackkey);
+ if ((player[0].parriedrecently <= 0 ||
+ player[0].weaponactive == -1) &&
+ (!oldattackkey ||
+ (realthreat &&
+ player[0].lastattack != swordslashanim &&
+ player[0].lastattack != knifeslashstartanim &&
+ player[0].lastattack != staffhitanim &&
+ player[0].lastattack != staffspinhitanim)))
+ player[0].attackkeydown = Input::isKeyDown(attackkey);
+ if (Input::isKeyDown(attackkey) &&
+ !oldattackkey &&
+ !player[0].backkeydown) {
+ for (int k = 0; k < numplayers; k++) {
+ if ((player[k].animTarget == swordslashanim ||
+ player[k].animTarget == staffhitanim ||
+ player[k].animTarget == staffspinhitanim) &&
+ player[0].animCurrent != dodgebackanim &&
!player[k].skeleton.free)
player[k].Reverse();
}
}
- if(!hostile||indialogue!=-1)player[0].attackkeydown=0;
+ if (!hostile || indialogue != -1)player[0].attackkeydown = 0;
- for(int k=0;k<numplayers;k++){
- if(indialogue!=-1)player[k].attackkeydown=0;
- if(player[k].animTarget!=rabbitrunninganim&&player[k].animTarget!=wolfrunninganim){
- if(player[k].aitype!=playercontrolled)
- player[k].victim=&player[0];
+ for (int k = 0; k < numplayers; k++) {
+ if (indialogue != -1)player[k].attackkeydown = 0;
+ if (player[k].animTarget != rabbitrunninganim && player[k].animTarget != wolfrunninganim) {
+ if (player[k].aitype != playercontrolled)
+ player[k].victim = &player[0];
//attack key pressed
- if(player[k].attackkeydown){
+ if (player[k].attackkeydown) {
//dodge backward
- if(player[k].backkeydown&&
- player[k].animTarget!=backhandspringanim&&
- (player[k].isIdle()||
- player[k].isStop()||
- player[k].isRun()||
- player[k].animTarget==walkanim)){
- if(player[k].jumppower<=1){
- player[k].jumppower-=2;
- }else{
- for(int i=0;i<numplayers;i++){
- if(i==k)continue;
- if(player[i].animTarget==swordslashanim||
- player[i].animTarget==knifeslashstartanim||
- player[i].animTarget==staffhitanim||
- player[i].animTarget==staffspinhitanim)
- if(distsq(&player[k].coords,&player[i].coords)<6.5&&!player[i].skeleton.free){
+ if (player[k].backkeydown &&
+ player[k].animTarget != backhandspringanim &&
+ (player[k].isIdle() ||
+ player[k].isStop() ||
+ player[k].isRun() ||
+ player[k].animTarget == walkanim)) {
+ if (player[k].jumppower <= 1) {
+ player[k].jumppower -= 2;
+ } else {
+ for (int i = 0; i < numplayers; i++) {
+ if (i == k)continue;
+ if (player[i].animTarget == swordslashanim ||
+ player[i].animTarget == knifeslashstartanim ||
+ player[i].animTarget == staffhitanim ||
+ player[i].animTarget == staffspinhitanim)
+ if (distsq(&player[k].coords, &player[i].coords) < 6.5 && !player[i].skeleton.free) {
player[k].setAnimation(dodgebackanim);
- player[k].targetyaw=roughDirectionTo(player[k].coords,player[i].coords);
- player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
+ player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
+ player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
}
}
- if(player[k].animTarget!=dodgebackanim){
- if(k==0)numflipped++;
+ if (player[k].animTarget != dodgebackanim) {
+ if (k == 0)numflipped++;
player[k].setAnimation(backhandspringanim);
- player[k].targetyaw=-yaw+180;
- if(player[k].leftkeydown)
- player[k].targetyaw-=45;
- if(player[k].rightkeydown)
- player[k].targetyaw+=45;
- player[k].yaw=player[k].targetyaw;
- player[k].jumppower-=2;
+ player[k].targetyaw = -yaw + 180;
+ if (player[k].leftkeydown)
+ player[k].targetyaw -= 45;
+ if (player[k].rightkeydown)
+ player[k].targetyaw += 45;
+ player[k].yaw = player[k].targetyaw;
+ player[k].jumppower -= 2;
}
}
}
//attack
- if(!animation[player[k].animTarget].attack&&
- !player[k].backkeydown&&
- (player[k].isIdle()||
- player[k].isRun()||
- player[k].animTarget==walkanim||
- player[k].animTarget==sneakanim||
- player[k].isCrouch())){
- const int attackweapon=player[k].weaponactive==-1?0:weapons[player[k].weaponids[player[k].weaponactive]].getType();
+ if (!animation[player[k].animTarget].attack &&
+ !player[k].backkeydown &&
+ (player[k].isIdle() ||
+ player[k].isRun() ||
+ player[k].animTarget == walkanim ||
+ player[k].animTarget == sneakanim ||
+ player[k].isCrouch())) {
+ const int attackweapon = player[k].weaponactive == -1 ? 0 : weapons[player[k].weaponids[player[k].weaponactive]].getType();
//normal attacks (?)
- player[k].hasvictim=0;
- if(numplayers>1)
- for(int i=0;i<numplayers;i++){
- if(i==k||!(k==0||i==0))continue;
- if(!player[k].hasvictim)
- if(animation[player[k].animTarget].attack!=reversal){
+ player[k].hasvictim = 0;
+ if (numplayers > 1)
+ for (int i = 0; i < numplayers; i++) {
+ if (i == k || !(k == 0 || i == 0))continue;
+ if (!player[k].hasvictim)
+ if (animation[player[k].animTarget].attack != reversal) {
//choose an attack
- const float distance=distsq(&player[k].coords,&player[i].coords);
- if(distance<4.5&&
- !player[i].skeleton.free&&
- player[i].howactive<typedead1&&
- player[i].animTarget!=jumpreversedanim&&
- player[i].animTarget!=rabbitkickreversedanim&&
- player[i].animTarget!=rabbitkickanim&&
- player[k].animTarget!=rabbitkickanim&&
- player[i].animTarget!=getupfrombackanim&&
- (player[i].animTarget!=staggerbackhighanim&&
- (player[i].animTarget!=staggerbackhardanim||
- animation[staggerbackhardanim].label[player[i].frameTarget]==6))&&
- player[i].animTarget!=jumpdownanim&&
- player[i].animTarget!=jumpupanim&&
- player[i].animTarget!=getupfromfrontanim){
- player[k].victim=&player[i];
- player[k].hasvictim=1;
- if(player[k].aitype==playercontrolled){ //human player
+ const float distance = distsq(&player[k].coords, &player[i].coords);
+ if (distance < 4.5 &&
+ !player[i].skeleton.free &&
+ player[i].howactive < typedead1 &&
+ player[i].animTarget != jumpreversedanim &&
+ player[i].animTarget != rabbitkickreversedanim &&
+ player[i].animTarget != rabbitkickanim &&
+ player[k].animTarget != rabbitkickanim &&
+ player[i].animTarget != getupfrombackanim &&
+ (player[i].animTarget != staggerbackhighanim &&
+ (player[i].animTarget != staggerbackhardanim ||
+ animation[staggerbackhardanim].label[player[i].frameTarget] == 6)) &&
+ player[i].animTarget != jumpdownanim &&
+ player[i].animTarget != jumpupanim &&
+ player[i].animTarget != getupfromfrontanim) {
+ player[k].victim = &player[i];
+ player[k].hasvictim = 1;
+ if (player[k].aitype == playercontrolled) { //human player
//sweep
- if(distance<2.5*sq(player[k].scale*5)&&
- player[k].crouchkeydown&&
- animation[player[i].animTarget].height!=lowheight)
- player[k].animTarget=sweepanim;
+ if (distance < 2.5 * sq(player[k].scale * 5) &&
+ player[k].crouchkeydown &&
+ animation[player[i].animTarget].height != lowheight)
+ player[k].animTarget = sweepanim;
//winduppunch
- else if(distance<1.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height!=lowheight&&
- !player[k].forwardkeydown&&
- !player[k].leftkeydown&&
- !player[k].rightkeydown&&
- !player[k].crouchkeydown&&
- !attackweapon&&
- !reversaltrain)
- player[k].animTarget=winduppunchanim;
+ else if (distance < 1.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height != lowheight &&
+ !player[k].forwardkeydown &&
+ !player[k].leftkeydown &&
+ !player[k].rightkeydown &&
+ !player[k].crouchkeydown &&
+ !attackweapon &&
+ !reversaltrain)
+ player[k].animTarget = winduppunchanim;
//upunch
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height!=lowheight&&
- !player[k].forwardkeydown&&
- !player[k].leftkeydown&&
- !player[k].rightkeydown&&
- !player[k].crouchkeydown&&
- !attackweapon)
- player[k].animTarget=upunchanim;
+ else if (distance < 2.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height != lowheight &&
+ !player[k].forwardkeydown &&
+ !player[k].leftkeydown &&
+ !player[k].rightkeydown &&
+ !player[k].crouchkeydown &&
+ !attackweapon)
+ player[k].animTarget = upunchanim;
//knifefollow
- else if(distance<2.5*sq(player[k].scale*5)&&
- player[i].staggerdelay>0&&
- attackweapon==knife&&
- player[i].bloodloss>player[i].damagetolerance/2)
- player[k].animTarget=knifefollowanim;
+ else if (distance < 2.5 * sq(player[k].scale * 5) &&
+ player[i].staggerdelay > 0 &&
+ attackweapon == knife &&
+ player[i].bloodloss > player[i].damagetolerance / 2)
+ player[k].animTarget = knifefollowanim;
//knifeslashstart
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height!=lowheight&&
- !player[k].forwardkeydown&&
- !player[k].leftkeydown&&
- !player[k].rightkeydown&&
- !player[k].crouchkeydown&&
- attackweapon==knife&&
- player[k].weaponmissdelay<=0)
- player[k].animTarget=knifeslashstartanim;
+ else if (distance < 2.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height != lowheight &&
+ !player[k].forwardkeydown &&
+ !player[k].leftkeydown &&
+ !player[k].rightkeydown &&
+ !player[k].crouchkeydown &&
+ attackweapon == knife &&
+ player[k].weaponmissdelay <= 0)
+ player[k].animTarget = knifeslashstartanim;
//swordslash
- else if(distance<4.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height!=lowheight&&
- !player[k].crouchkeydown&&
- attackweapon==sword&&
- player[k].weaponmissdelay<=0)
- player[k].animTarget=swordslashanim;
+ else if (distance < 4.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height != lowheight &&
+ !player[k].crouchkeydown &&
+ attackweapon == sword &&
+ player[k].weaponmissdelay <= 0)
+ player[k].animTarget = swordslashanim;
//staffhit
- else if(distance<4.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height!=lowheight&&
- !player[k].crouchkeydown&&
- attackweapon==staff&&
- player[k].weaponmissdelay<=0&&
- !player[k].leftkeydown&&
- !player[k].rightkeydown&&
- !player[k].forwardkeydown)
- player[k].animTarget=staffhitanim;
+ else if (distance < 4.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height != lowheight &&
+ !player[k].crouchkeydown &&
+ attackweapon == staff &&
+ player[k].weaponmissdelay <= 0 &&
+ !player[k].leftkeydown &&
+ !player[k].rightkeydown &&
+ !player[k].forwardkeydown)
+ player[k].animTarget = staffhitanim;
//staffspinhit
- else if(distance<4.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height!=lowheight&&
- !player[k].crouchkeydown&&
- attackweapon==staff&&
- player[k].weaponmissdelay<=0)
- player[k].animTarget=staffspinhitanim;
+ else if (distance < 4.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height != lowheight &&
+ !player[k].crouchkeydown &&
+ attackweapon == staff &&
+ player[k].weaponmissdelay <= 0)
+ player[k].animTarget = staffspinhitanim;
//spinkick
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height!=lowheight)
- player[k].animTarget=spinkickanim;
+ else if (distance < 2.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height != lowheight)
+ player[k].animTarget = spinkickanim;
//lowkick
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height==lowheight&&
- animation[player[k].animTarget].attack!=normalattack)
- player[k].animTarget=lowkickanim;
+ else if (distance < 2.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height == lowheight &&
+ animation[player[k].animTarget].attack != normalattack)
+ player[k].animTarget = lowkickanim;
} else { //AI player
- if(distance<4.5*sq(player[k].scale*5)){
- randattack=abs(Random()%5);
- if(!attackweapon&&distance<2.5*sq(player[k].scale*5)){
+ if (distance < 4.5 * sq(player[k].scale * 5)) {
+ randattack = abs(Random() % 5);
+ if (!attackweapon && distance < 2.5 * sq(player[k].scale * 5)) {
//sweep
- if(randattack==0&&animation[player[i].animTarget].height!=lowheight)
- player[k].animTarget=sweepanim;
+ if (randattack == 0 && animation[player[i].animTarget].height != lowheight)
+ player[k].animTarget = sweepanim;
//upunch
- else if(randattack==1&&animation[player[i].animTarget].height!=lowheight&&
- !attackweapon)
- player[k].animTarget=upunchanim;
+ else if (randattack == 1 && animation[player[i].animTarget].height != lowheight &&
+ !attackweapon)
+ player[k].animTarget = upunchanim;
//spinkick
- else if(randattack==2&&animation[player[i].animTarget].height!=lowheight)
- player[k].animTarget=spinkickanim;
+ else if (randattack == 2 && animation[player[i].animTarget].height != lowheight)
+ player[k].animTarget = spinkickanim;
//lowkick
- else if(animation[player[i].animTarget].height==lowheight)
- player[k].animTarget=lowkickanim;
+ else if (animation[player[i].animTarget].height == lowheight)
+ player[k].animTarget = lowkickanim;
}
- if(attackweapon){
+ if (attackweapon) {
//sweep
- if((tutoriallevel!=1||!attackweapon)&&
- distance<2.5*sq(player[k].scale*5)&&
- randattack==0&&
- animation[player[i].animTarget].height!=lowheight)
- player[k].animTarget=sweepanim;
+ if ((tutoriallevel != 1 || !attackweapon) &&
+ distance < 2.5 * sq(player[k].scale * 5) &&
+ randattack == 0 &&
+ animation[player[i].animTarget].height != lowheight)
+ player[k].animTarget = sweepanim;
//knifeslashstart
- else if(distance<2.5*sq(player[k].scale*5)&&
- attackweapon==knife&&
- player[k].weaponmissdelay<=0)
- player[k].animTarget=knifeslashstartanim;
+ else if (distance < 2.5 * sq(player[k].scale * 5) &&
+ attackweapon == knife &&
+ player[k].weaponmissdelay <= 0)
+ player[k].animTarget = knifeslashstartanim;
//swordslash
- else if(!(player[0].victim==&player[i]&&
- player[0].hasvictim&&
- player[0].animTarget==swordslashanim)&&
- attackweapon==sword&&
- player[k].weaponmissdelay<=0)
- player[k].animTarget=swordslashanim;
+ else if (!(player[0].victim == &player[i] &&
+ player[0].hasvictim &&
+ player[0].animTarget == swordslashanim) &&
+ attackweapon == sword &&
+ player[k].weaponmissdelay <= 0)
+ player[k].animTarget = swordslashanim;
//staffhit
- else if(!(player[0].victim==&player[i]&&
- player[0].hasvictim&&
- player[0].animTarget==swordslashanim)&&
- attackweapon==staff&&
- player[k].weaponmissdelay<=0&&
- randattack<3)
- player[k].animTarget=staffhitanim;
+ else if (!(player[0].victim == &player[i] &&
+ player[0].hasvictim &&
+ player[0].animTarget == swordslashanim) &&
+ attackweapon == staff &&
+ player[k].weaponmissdelay <= 0 &&
+ randattack < 3)
+ player[k].animTarget = staffhitanim;
//staffspinhit
- else if(!(player[0].victim==&player[i]&&
- player[0].hasvictim&&
- player[0].animTarget==swordslashanim)&&
- attackweapon==staff&&
- player[k].weaponmissdelay<=0&&
- randattack>=3)
- player[k].animTarget=staffspinhitanim;
+ else if (!(player[0].victim == &player[i] &&
+ player[0].hasvictim &&
+ player[0].animTarget == swordslashanim) &&
+ attackweapon == staff &&
+ player[k].weaponmissdelay <= 0 &&
+ randattack >= 3)
+ player[k].animTarget = staffspinhitanim;
//spinkick
- else if((tutoriallevel!=1||!attackweapon)&&
- distance<2.5*sq(player[k].scale*5)&&
- randattack==1&&
- animation[player[i].animTarget].height!=lowheight)
- player[k].animTarget=spinkickanim;
+ else if ((tutoriallevel != 1 || !attackweapon) &&
+ distance < 2.5 * sq(player[k].scale * 5) &&
+ randattack == 1 &&
+ animation[player[i].animTarget].height != lowheight)
+ player[k].animTarget = spinkickanim;
//lowkick
- else if(distance<2.5*sq(player[k].scale*5)&&
- animation[player[i].animTarget].height==lowheight&&
- animation[player[k].animTarget].attack!=normalattack)
- player[k].animTarget=lowkickanim;
+ else if (distance < 2.5 * sq(player[k].scale * 5) &&
+ animation[player[i].animTarget].height == lowheight &&
+ animation[player[k].animTarget].attack != normalattack)
+ player[k].animTarget = lowkickanim;
}
}
}
//upunch becomes wolfslap
- if(player[k].animTarget==upunchanim&&player[k].creature==wolftype)
- player[k].animTarget=wolfslapanim;
+ if (player[k].animTarget == upunchanim && player[k].creature == wolftype)
+ player[k].animTarget = wolfslapanim;
}
//sneak attacks
- if((k==0)&&(tutoriallevel!=1||tutorialstage==22)&&
- player[i].howactive<typedead1&&
- distance<1.5*sq(player[k].scale*5)&&
- !player[i].skeleton.free&&
- player[i].animTarget!=getupfrombackanim&&
- player[i].animTarget!=getupfromfrontanim&&
- (player[i].stunned>0&&player[k].madskills||
- player[i].surprised>0||
- player[i].aitype==passivetype||
- attackweapon&&player[i].stunned>0)&&
- normaldotproduct(player[i].facing,player[i].coords-player[k].coords)>0){
+ if ((k == 0) && (tutoriallevel != 1 || tutorialstage == 22) &&
+ player[i].howactive < typedead1 &&
+ distance < 1.5 * sq(player[k].scale * 5) &&
+ !player[i].skeleton.free &&
+ player[i].animTarget != getupfrombackanim &&
+ player[i].animTarget != getupfromfrontanim &&
+ (player[i].stunned > 0 && player[k].madskills ||
+ player[i].surprised > 0 ||
+ player[i].aitype == passivetype ||
+ attackweapon && player[i].stunned > 0) &&
+ normaldotproduct(player[i].facing, player[i].coords - player[k].coords) > 0) {
//sneakattack
- if(!attackweapon){
- player[k].animCurrent=sneakattackanim;
- player[k].animTarget=sneakattackanim;
- player[i].animCurrent=sneakattackedanim;
- player[i].animTarget=sneakattackedanim;
- player[k].oldcoords=player[k].coords;
- player[k].coords=player[i].coords;
+ if (!attackweapon) {
+ player[k].animCurrent = sneakattackanim;
+ player[k].animTarget = sneakattackanim;
+ player[i].animCurrent = sneakattackedanim;
+ player[i].animTarget = sneakattackedanim;
+ player[k].oldcoords = player[k].coords;
+ player[k].coords = player[i].coords;
}
//knifesneakattack
- if(attackweapon==knife){
- player[k].animCurrent=knifesneakattackanim;
- player[k].animTarget=knifesneakattackanim;
- player[i].animCurrent=knifesneakattackedanim;
- player[i].animTarget=knifesneakattackedanim;
- player[i].oldcoords=player[i].coords;
- player[i].coords=player[k].coords;
+ if (attackweapon == knife) {
+ player[k].animCurrent = knifesneakattackanim;
+ player[k].animTarget = knifesneakattackanim;
+ player[i].animCurrent = knifesneakattackedanim;
+ player[i].animTarget = knifesneakattackedanim;
+ player[i].oldcoords = player[i].coords;
+ player[i].coords = player[k].coords;
}
//swordsneakattack
- if(attackweapon==sword){
- player[k].animCurrent=swordsneakattackanim;
- player[k].animTarget=swordsneakattackanim;
- player[i].animCurrent=swordsneakattackedanim;
- player[i].animTarget=swordsneakattackedanim;
- player[i].oldcoords=player[i].coords;
- player[i].coords=player[k].coords;
+ if (attackweapon == sword) {
+ player[k].animCurrent = swordsneakattackanim;
+ player[k].animTarget = swordsneakattackanim;
+ player[i].animCurrent = swordsneakattackedanim;
+ player[i].animTarget = swordsneakattackedanim;
+ player[i].oldcoords = player[i].coords;
+ player[i].coords = player[k].coords;
}
- if(attackweapon!=staff){
- player[k].victim=&player[i];
- player[k].hasvictim=1;
- player[i].targettilt2=0;
- player[i].frameTarget=1;
- player[i].frameCurrent=0;
- player[i].target=0;
- player[i].velocity=0;
- player[k].targettilt2=player[i].targettilt2;
- player[k].frameCurrent=player[i].frameCurrent;
- player[k].frameTarget=player[i].frameTarget;
- player[k].target=player[i].target;
- player[k].velocity=0;
- player[k].targetyaw=player[i].yaw;
- player[k].yaw=player[i].yaw;
- player[i].targetyaw=player[i].yaw;
+ if (attackweapon != staff) {
+ player[k].victim = &player[i];
+ player[k].hasvictim = 1;
+ player[i].targettilt2 = 0;
+ player[i].frameTarget = 1;
+ player[i].frameCurrent = 0;
+ player[i].target = 0;
+ player[i].velocity = 0;
+ player[k].targettilt2 = player[i].targettilt2;
+ player[k].frameCurrent = player[i].frameCurrent;
+ player[k].frameTarget = player[i].frameTarget;
+ player[k].target = player[i].target;
+ player[k].velocity = 0;
+ player[k].targetyaw = player[i].yaw;
+ player[k].yaw = player[i].yaw;
+ player[i].targetyaw = player[i].yaw;
}
}
- if(animation[player[k].animTarget].attack==normalattack&&
- player[k].victim==&player[i]&&
- (!player[i].skeleton.free)){
- oldattackkey=1;
- player[k].frameTarget=0;
- player[k].target=0;
-
- player[k].targetyaw=roughDirectionTo(player[k].coords,player[i].coords);
- player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
- player[k].lastattack3=player[k].lastattack2;
- player[k].lastattack2=player[k].lastattack;
- player[k].lastattack=player[k].animTarget;
+ if (animation[player[k].animTarget].attack == normalattack &&
+ player[k].victim == &player[i] &&
+ (!player[i].skeleton.free)) {
+ oldattackkey = 1;
+ player[k].frameTarget = 0;
+ player[k].target = 0;
+
+ player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
+ player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
+ player[k].lastattack3 = player[k].lastattack2;
+ player[k].lastattack2 = player[k].lastattack;
+ player[k].lastattack = player[k].animTarget;
}
- if(player[k].animTarget==knifefollowanim&&
- player[k].victim==&player[i]){
- oldattackkey=1;
- player[k].targetyaw=roughDirectionTo(player[k].coords,player[i].coords);
- player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
- player[k].victim=&player[i];
- player[k].hasvictim=1;
- player[i].animTarget=knifefollowedanim;
- player[i].animCurrent=knifefollowedanim;
- player[i].targettilt2=0;
- player[i].targettilt2=player[k].targettilt2;
- player[i].frameTarget=1;
- player[i].frameCurrent=0;
- player[i].target=0;
- player[i].velocity=0;
- player[k].animCurrent=knifefollowanim;
- player[k].animTarget=knifefollowanim;
- player[k].targettilt2=player[i].targettilt2;
- player[k].frameCurrent=player[i].frameCurrent;
- player[k].frameTarget=player[i].frameTarget;
- player[k].target=player[i].target;
- player[k].velocity=0;
- player[k].oldcoords=player[k].coords;
- player[i].coords=player[k].coords;
- player[i].targetyaw=player[k].targetyaw;
- player[i].yaw=player[k].targetyaw;
- player[k].yaw=player[k].targetyaw;
- player[i].yaw=player[k].targetyaw;
+ if (player[k].animTarget == knifefollowanim &&
+ player[k].victim == &player[i]) {
+ oldattackkey = 1;
+ player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
+ player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
+ player[k].victim = &player[i];
+ player[k].hasvictim = 1;
+ player[i].animTarget = knifefollowedanim;
+ player[i].animCurrent = knifefollowedanim;
+ player[i].targettilt2 = 0;
+ player[i].targettilt2 = player[k].targettilt2;
+ player[i].frameTarget = 1;
+ player[i].frameCurrent = 0;
+ player[i].target = 0;
+ player[i].velocity = 0;
+ player[k].animCurrent = knifefollowanim;
+ player[k].animTarget = knifefollowanim;
+ player[k].targettilt2 = player[i].targettilt2;
+ player[k].frameCurrent = player[i].frameCurrent;
+ player[k].frameTarget = player[i].frameTarget;
+ player[k].target = player[i].target;
+ player[k].velocity = 0;
+ player[k].oldcoords = player[k].coords;
+ player[i].coords = player[k].coords;
+ player[i].targetyaw = player[k].targetyaw;
+ player[i].yaw = player[k].targetyaw;
+ player[k].yaw = player[k].targetyaw;
+ player[i].yaw = player[k].targetyaw;
}
}
}
- const bool hasstaff=attackweapon==staff;
- if(k==0&&numplayers>1)
- for(int i=0;i<numplayers;i++){
- if(i==k)continue;
- if((playerrealattackkeydown||player[i].dead||!hasstaff)&&
- animation[player[k].animTarget].attack==neutral){
- const float distance=distsq(&player[k].coords,&player[i].coords);
- if(!player[i].dead||!realthreat||(!attackweapon&&player[k].crouchkeydown))
- if(player[i].skeleton.free)
- if(distance<3.5*sq(player[k].scale*5)&&
- (player[i].dead||
- player[i].skeleton.longdead>1000||
- player[k].isRun()||
- hasstaff||
- (attackweapon&&
- (player[i].skeleton.longdead>2000||
- player[i].damage>player[i].damagetolerance/8||
- player[i].bloodloss>player[i].damagetolerance/2)&&
- distance<1.5*sq(player[k].scale*5)))){
- player[k].victim=&player[i];
- player[k].hasvictim=1;
- if(attackweapon&&tutoriallevel!=1){
+ const bool hasstaff = attackweapon == staff;
+ if (k == 0 && numplayers > 1)
+ for (int i = 0; i < numplayers; i++) {
+ if (i == k)continue;
+ if ((playerrealattackkeydown || player[i].dead || !hasstaff) &&
+ animation[player[k].animTarget].attack == neutral) {
+ const float distance = distsq(&player[k].coords, &player[i].coords);
+ if (!player[i].dead || !realthreat || (!attackweapon && player[k].crouchkeydown))
+ if (player[i].skeleton.free)
+ if (distance < 3.5 * sq(player[k].scale * 5) &&
+ (player[i].dead ||
+ player[i].skeleton.longdead > 1000 ||
+ player[k].isRun() ||
+ hasstaff ||
+ (attackweapon &&
+ (player[i].skeleton.longdead > 2000 ||
+ player[i].damage > player[i].damagetolerance / 8 ||
+ player[i].bloodloss > player[i].damagetolerance / 2) &&
+ distance < 1.5 * sq(player[k].scale * 5)))) {
+ player[k].victim = &player[i];
+ player[k].hasvictim = 1;
+ if (attackweapon && tutoriallevel != 1) {
//crouchstab
- if(player[k].crouchkeydown&&attackweapon==knife&&distance<1.5*sq(player[k].scale*5))
- player[k].animTarget=crouchstabanim;
+ if (player[k].crouchkeydown && attackweapon == knife && distance < 1.5 * sq(player[k].scale * 5))
+ player[k].animTarget = crouchstabanim;
//swordgroundstab
- if(player[k].crouchkeydown&&distance<1.5*sq(player[k].scale*5)&&attackweapon==sword)
- player[k].animTarget=swordgroundstabanim;
+ if (player[k].crouchkeydown && distance < 1.5 * sq(player[k].scale * 5) && attackweapon == sword)
+ player[k].animTarget = swordgroundstabanim;
//staffgroundsmash
- if(distance<3.5*sq(player[k].scale*5)&&attackweapon==staff)
- player[k].animTarget=staffgroundsmashanim;
+ if (distance < 3.5 * sq(player[k].scale * 5) && attackweapon == staff)
+ player[k].animTarget = staffgroundsmashanim;
}
- if(distance<2.5&&
- player[k].crouchkeydown&&
- player[k].animTarget!=crouchstabanim&&
- !attackweapon&&
- player[i].dead&&
- player[i].skeleton.free&&
- player[i].skeleton.longdead>1000){
- player[k].animTarget=killanim;
+ if (distance < 2.5 &&
+ player[k].crouchkeydown &&
+ player[k].animTarget != crouchstabanim &&
+ !attackweapon &&
+ player[i].dead &&
+ player[i].skeleton.free &&
+ player[i].skeleton.longdead > 1000) {
+ player[k].animTarget = killanim;
//TODO: refactor this out, what does it do?
- for(int j=0;j<terrain.numdecals;j++){
- if((terrain.decaltype[j]==blooddecal||terrain.decaltype[j]==blooddecalslow)&&
- terrain.decalalivetime[j]<2)
+ for (int j = 0; j < terrain.numdecals; j++) {
+ if ((terrain.decaltype[j] == blooddecal || terrain.decaltype[j] == blooddecalslow) &&
+ terrain.decalalivetime[j] < 2)
terrain.DeleteDecal(j);
}
- for(int l=0;l<objects.numobjects;l++){
- if(objects.model[l].type==decalstype)
- for(int j=0;j<objects.model[l].numdecals;j++){
- if((objects.model[l].decaltype[j]==blooddecal||
- objects.model[l].decaltype[j]==blooddecalslow)&&
- objects.model[l].decalalivetime[j]<2)
+ for (int l = 0; l < objects.numobjects; l++) {
+ if (objects.model[l].type == decalstype)
+ for (int j = 0; j < objects.model[l].numdecals; j++) {
+ if ((objects.model[l].decaltype[j] == blooddecal ||
+ objects.model[l].decaltype[j] == blooddecalslow) &&
+ objects.model[l].decalalivetime[j] < 2)
objects.model[l].DeleteDecal(j);
}
}
}
- if(!player[i].dead||musictype!=2)
- if(distance<3.5&&
- (player[k].isRun()||player[k].isIdle()&&player[k].attackkeydown)&&
- player[k].staggerdelay<=0&&
- (player[i].dead||
- player[i].skeleton.longdead<300&&
- player[k].lastattack!=spinkickanim&&
- player[i].skeleton.free)&&
- (!player[i].dead||musictype!=stream_fighttheme)){
- player[k].animTarget=dropkickanim;
- for(int j=0;j<terrain.numdecals;j++){
- if((terrain.decaltype[j]==blooddecal||terrain.decaltype[j]==blooddecalslow)&&
- terrain.decalalivetime[j]<2){
+ if (!player[i].dead || musictype != 2)
+ if (distance < 3.5 &&
+ (player[k].isRun() || player[k].isIdle() && player[k].attackkeydown) &&
+ player[k].staggerdelay <= 0 &&
+ (player[i].dead ||
+ player[i].skeleton.longdead < 300 &&
+ player[k].lastattack != spinkickanim &&
+ player[i].skeleton.free) &&
+ (!player[i].dead || musictype != stream_fighttheme)) {
+ player[k].animTarget = dropkickanim;
+ for (int j = 0; j < terrain.numdecals; j++) {
+ if ((terrain.decaltype[j] == blooddecal || terrain.decaltype[j] == blooddecalslow) &&
+ terrain.decalalivetime[j] < 2) {
terrain.DeleteDecal(j);
}
}
- for(int l=0;l<objects.numobjects;l++){
- if(objects.model[l].type==decalstype)
- for(int j=0;j<objects.model[l].numdecals;j++){
- if((objects.model[l].decaltype[j]==blooddecal||
- objects.model[l].decaltype[j]==blooddecalslow)&&
- objects.model[l].decalalivetime[j]<2){
+ for (int l = 0; l < objects.numobjects; l++) {
+ if (objects.model[l].type == decalstype)
+ for (int j = 0; j < objects.model[l].numdecals; j++) {
+ if ((objects.model[l].decaltype[j] == blooddecal ||
+ objects.model[l].decaltype[j] == blooddecalslow) &&
+ objects.model[l].decalalivetime[j] < 2) {
objects.model[l].DeleteDecal(j);
}
}
}
}
}
- if(animation[player[k].animTarget].attack==normalattack&&
- player[k].victim==&player[i]&&
- (!player[i].skeleton.free||
- player[k].animTarget==killanim||
- player[k].animTarget==crouchstabanim||
- player[k].animTarget==swordgroundstabanim||
- player[k].animTarget==staffgroundsmashanim||
- player[k].animTarget==dropkickanim)){
- oldattackkey=1;
- player[k].frameTarget=0;
- player[k].target=0;
-
- XYZ targetpoint=player[i].coords;
- if(player[k].animTarget==crouchstabanim||
- player[k].animTarget==swordgroundstabanim||
- player[k].animTarget==staffgroundsmashanim){
- targetpoint+=(player[i].jointPos(abdomen)+
- player[i].jointPos(neck))/2*
- player[i].scale;
+ if (animation[player[k].animTarget].attack == normalattack &&
+ player[k].victim == &player[i] &&
+ (!player[i].skeleton.free ||
+ player[k].animTarget == killanim ||
+ player[k].animTarget == crouchstabanim ||
+ player[k].animTarget == swordgroundstabanim ||
+ player[k].animTarget == staffgroundsmashanim ||
+ player[k].animTarget == dropkickanim)) {
+ oldattackkey = 1;
+ player[k].frameTarget = 0;
+ player[k].target = 0;
+
+ XYZ targetpoint = player[i].coords;
+ if (player[k].animTarget == crouchstabanim ||
+ player[k].animTarget == swordgroundstabanim ||
+ player[k].animTarget == staffgroundsmashanim) {
+ targetpoint += (player[i].jointPos(abdomen) +
+ player[i].jointPos(neck)) / 2 *
+ player[i].scale;
}
- player[k].targetyaw=roughDirectionTo(player[k].coords,targetpoint);
- player[k].targettilt2=pitchTo(player[k].coords,targetpoint);
+ player[k].targetyaw = roughDirectionTo(player[k].coords, targetpoint);
+ player[k].targettilt2 = pitchTo(player[k].coords, targetpoint);
- if(player[k].animTarget==crouchstabanim||player[k].animTarget==swordgroundstabanim){
- player[k].targetyaw+=(float)(abs(Random()%100)-50)/4;
+ if (player[k].animTarget == crouchstabanim || player[k].animTarget == swordgroundstabanim) {
+ player[k].targetyaw += (float)(abs(Random() % 100) - 50) / 4;
}
- if(player[k].animTarget==staffgroundsmashanim)
- player[k].targettilt2+=10;
+ if (player[k].animTarget == staffgroundsmashanim)
+ player[k].targettilt2 += 10;
- player[k].lastattack3=player[k].lastattack2;
- player[k].lastattack2=player[k].lastattack;
- player[k].lastattack=player[k].animTarget;
+ player[k].lastattack3 = player[k].lastattack2;
+ player[k].lastattack2 = player[k].lastattack;
+ player[k].lastattack = player[k].animTarget;
- if(player[k].animTarget==swordgroundstabanim){
- player[k].targetyaw+=30;
+ if (player[k].animTarget == swordgroundstabanim) {
+ player[k].targetyaw += 30;
}
}
}
}
- if(!player[k].hasvictim){
+ if (!player[k].hasvictim) {
//find victim
- for(int i=0;i<numplayers;i++){
- if(i==k||!(i==0||k==0))continue;
- if(!player[i].skeleton.free){
- if(player[k].hasvictim){
- if(distsq(&player[k].coords,&player[i].coords)<
- distsq(&player[k].coords,&player[k].victim->coords))
- player[k].victim=&player[i];
- }else{
- player[k].victim=&player[i];
- player[k].hasvictim=1;
+ for (int i = 0; i < numplayers; i++) {
+ if (i == k || !(i == 0 || k == 0))continue;
+ if (!player[i].skeleton.free) {
+ if (player[k].hasvictim) {
+ if (distsq(&player[k].coords, &player[i].coords) <
+ distsq(&player[k].coords, &player[k].victim->coords))
+ player[k].victim = &player[i];
+ } else {
+ player[k].victim = &player[i];
+ player[k].hasvictim = 1;
}
}
}
}
- if(player[k].aitype==playercontrolled)
+ if (player[k].aitype == playercontrolled)
//rabbit kick
- if(player[k].attackkeydown&&
- player[k].isRun()&&
- player[k].wasRun()&&
- ((player[k].hasvictim&&
- distsq(&player[k].coords,&player[k].victim->coords)<12*sq(player[k].scale*5)&&
- distsq(&player[k].coords,&player[k].victim->coords)>7*sq(player[k].scale*5)&&
- !player[k].victim->skeleton.free&&
- player[k].victim->animTarget!=getupfrombackanim&&
- player[k].victim->animTarget!=getupfromfrontanim&&
- animation[player[k].victim->animTarget].height!=lowheight&&
- player[k].aitype!=playercontrolled&& //wat???
- normaldotproduct(player[k].facing,player[k].victim->coords-player[k].coords)>0&&
- player[k].rabbitkickenabled)||
- player[k].jumpkeydown)){
- oldattackkey=1;
+ if (player[k].attackkeydown &&
+ player[k].isRun() &&
+ player[k].wasRun() &&
+ ((player[k].hasvictim &&
+ distsq(&player[k].coords, &player[k].victim->coords) < 12 * sq(player[k].scale * 5) &&
+ distsq(&player[k].coords, &player[k].victim->coords) > 7 * sq(player[k].scale * 5) &&
+ !player[k].victim->skeleton.free &&
+ player[k].victim->animTarget != getupfrombackanim &&
+ player[k].victim->animTarget != getupfromfrontanim &&
+ animation[player[k].victim->animTarget].height != lowheight &&
+ player[k].aitype != playercontrolled && //wat???
+ normaldotproduct(player[k].facing, player[k].victim->coords - player[k].coords) > 0 &&
+ player[k].rabbitkickenabled) ||
+ player[k].jumpkeydown)) {
+ oldattackkey = 1;
player[k].setAnimation(rabbitkickanim);
}
//update counts
- if(animation[player[k].animTarget].attack&&k==0){
+ if (animation[player[k].animTarget].attack && k == 0) {
numattacks++;
- switch(attackweapon){
- case 0: numunarmedattack++; break;
- case knife: numknifeattack++; break;
- case sword: numswordattack++; break;
- case staff: numstaffattack++; break;
+ switch (attackweapon) {
+ case 0:
+ numunarmedattack++;
+ break;
+ case knife:
+ numknifeattack++;
+ break;
+ case sword:
+ numswordattack++;
+ break;
+ case staff:
+ numstaffattack++;
+ break;
}
}
}
}
}
-void doPlayerCollisions(){
- static XYZ rotatetarget;
+void doPlayerCollisions()
+{
+ static XYZ rotatetarget;
static float collisionradius;
- if(numplayers>1)
- for(int k=0;k<numplayers;k++)
- for(int i=k+1;i<numplayers;i++){
+ if (numplayers > 1)
+ for (int k = 0; k < numplayers; k++)
+ for (int i = k + 1; i < numplayers; i++) {
//neither player is part of a reversal
- if((animation[player[i].animTarget].attack!=reversed&&
- animation[player[i].animTarget].attack!=reversal&&
- animation[player[k].animTarget].attack!=reversed&&
- animation[player[k].animTarget].attack!=reversal)||(i!=0&&k!=0))
- if((animation[player[i].animCurrent].attack!=reversed&&
- animation[player[i].animCurrent].attack!=reversal&&
- animation[player[k].animCurrent].attack!=reversed&&
- animation[player[k].animCurrent].attack!=reversal)||(i!=0&&k!=0))
- //neither is sleeping
- if(player[i].howactive<=typesleeping&&player[k].howactive<=typesleeping)
- if(player[i].howactive!=typesittingwall&&player[k].howactive!=typesittingwall)
- //in same patch, neither is climbing
- if(player[i].whichpatchx==player[k].whichpatchx&&
- player[i].whichpatchz==player[k].whichpatchz&&
- player[k].skeleton.oldfree==player[k].skeleton.free&&
- player[i].skeleton.oldfree==player[i].skeleton.free&&
- player[i].animTarget!=climbanim&&
- player[i].animTarget!=hanganim&&
- player[k].animTarget!=climbanim&&
- player[k].animTarget!=hanganim)
- //players are close (bounding box test)
- if(player[i].coords.y>player[k].coords.y-3)
- if(player[i].coords.y<player[k].coords.y+3)
- if(player[i].coords.x>player[k].coords.x-3)
- if(player[i].coords.x<player[k].coords.x+3)
- if(player[i].coords.z>player[k].coords.z-3)
- if(player[i].coords.z<player[k].coords.z+3){
- //spread fire from player to player
- if(distsq(&player[i].coords,&player[k].coords)
- <3*sq((player[i].scale+player[k].scale)*2.5)){
- if(player[i].onfire||player[k].onfire){
- if(!player[i].onfire)player[i].CatchFire();
- if(!player[k].onfire)player[k].CatchFire();
- }
- }
-
- XYZ tempcoords1=player[i].coords;
- XYZ tempcoords2=player[k].coords;
- if(!player[i].skeleton.oldfree)
- tempcoords1.y+=player[i].jointPos(abdomen).y*player[i].scale;
- if(!player[k].skeleton.oldfree)
- tempcoords2.y+=player[k].jointPos(abdomen).y*player[k].scale;
- collisionradius=1.2*sq((player[i].scale+player[k].scale)*2.5);
- if(player[0].hasvictim)
- if(player[0].animTarget==rabbitkickanim&&(k==0||i==0)&&!player[0].victim->skeleton.free)
- collisionradius=3;
- if((!player[i].skeleton.oldfree||!player[k].skeleton.oldfree)&&
- (distsq(&tempcoords1,&tempcoords2)<collisionradius||
- distsq(&player[i].coords,&player[k].coords)<collisionradius)){
- //jump down on a dead body
- if(k==0||i==0){
- int l=i?i:k;
- if(player[0].animTarget==jumpdownanim&&
- !player[0].skeleton.oldfree&&
- !player[0].skeleton.free&&
- player[l].skeleton.oldfree&&
- player[l].skeleton.free&&
- player[l].dead&&
- player[0].lastcollide<=0&&
- fabs(player[l].coords.y-player[0].coords.y)<.2&&
- distsq(&player[0].coords,&player[l].coords)<.7*sq((player[l].scale+player[0].scale)*2.5)){
- player[0].coords.y=player[l].coords.y;
- player[l].velocity=player[0].velocity;
- player[l].skeleton.free=0;
- player[l].yaw=0;
- player[l].RagDoll(0);
- player[l].DoDamage(20);
- camerashake+=.3;
- player[l].skeleton.longdead=0;
- player[0].lastcollide=1;
- }
- }
-
- if( (player[i].skeleton.oldfree==1&&findLengthfast(&player[i].velocity)>1)||
- (player[k].skeleton.oldfree==1&&findLengthfast(&player[k].velocity)>1)||
- (player[i].skeleton.oldfree==0&&player[k].skeleton.oldfree==0)){
- rotatetarget=player[k].velocity-player[i].velocity;
- if((player[i].animTarget!=getupfrombackanim&&player[i].animTarget!=getupfromfrontanim||
- player[i].skeleton.free)&&
- (player[k].animTarget!=getupfrombackanim&&player[k].animTarget!=getupfromfrontanim||
- player[k].skeleton.free))
- if((((k!=0&&findLengthfast(&rotatetarget)>150||
- k==0&&findLengthfast(&rotatetarget)>50&&player[0].rabbitkickragdoll)&&
- normaldotproduct(rotatetarget,player[k].coords-player[i].coords)>0)&&
- (k==0||
- k!=0&&player[i].skeleton.oldfree==1&&animation[player[k].animCurrent].attack==neutral||
- /*i!=0&&*/player[k].skeleton.oldfree==1&&animation[player[i].animCurrent].attack==neutral))||
- (player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip())&&
- (player[k].animTarget==jumpupanim||player[k].animTarget==jumpdownanim||player[k].isFlip())&&
- k==0&&!player[i].skeleton.oldfree&&!player[k].skeleton.oldfree){
- //If hit by body
- if( (i!=0||player[i].skeleton.free)&&
- (k!=0||player[k].skeleton.free)||
- (animation[player[i].animTarget].height==highheight&&
- animation[player[k].animTarget].height==highheight)){
- if(tutoriallevel!=1){
- emit_sound_at(heavyimpactsound, player[i].coords);
- }
-
- player[i].RagDoll(0);
- if(player[i].damage>player[i].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[i].dead){
- award_bonus(0, aimbonus);
- }
- player[i].DoDamage(findLengthfast(&rotatetarget)/4);
- player[k].RagDoll(0);
- if(player[k].damage>player[k].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[k].dead){
- award_bonus(0, aimbonus); // Huh, again?
- }
- player[k].DoDamage(findLengthfast(&rotatetarget)/4);
+ if ((animation[player[i].animTarget].attack != reversed &&
+ animation[player[i].animTarget].attack != reversal &&
+ animation[player[k].animTarget].attack != reversed &&
+ animation[player[k].animTarget].attack != reversal) || (i != 0 && k != 0))
+ if ((animation[player[i].animCurrent].attack != reversed &&
+ animation[player[i].animCurrent].attack != reversal &&
+ animation[player[k].animCurrent].attack != reversed &&
+ animation[player[k].animCurrent].attack != reversal) || (i != 0 && k != 0))
+ //neither is sleeping
+ if (player[i].howactive <= typesleeping && player[k].howactive <= typesleeping)
+ if (player[i].howactive != typesittingwall && player[k].howactive != typesittingwall)
+ //in same patch, neither is climbing
+ if (player[i].whichpatchx == player[k].whichpatchx &&
+ player[i].whichpatchz == player[k].whichpatchz &&
+ player[k].skeleton.oldfree == player[k].skeleton.free &&
+ player[i].skeleton.oldfree == player[i].skeleton.free &&
+ player[i].animTarget != climbanim &&
+ player[i].animTarget != hanganim &&
+ player[k].animTarget != climbanim &&
+ player[k].animTarget != hanganim)
+ //players are close (bounding box test)
+ if (player[i].coords.y > player[k].coords.y - 3)
+ if (player[i].coords.y < player[k].coords.y + 3)
+ if (player[i].coords.x > player[k].coords.x - 3)
+ if (player[i].coords.x < player[k].coords.x + 3)
+ if (player[i].coords.z > player[k].coords.z - 3)
+ if (player[i].coords.z < player[k].coords.z + 3) {
+ //spread fire from player to player
+ if (distsq(&player[i].coords, &player[k].coords)
+ < 3 * sq((player[i].scale + player[k].scale) * 2.5)) {
+ if (player[i].onfire || player[k].onfire) {
+ if (!player[i].onfire)player[i].CatchFire();
+ if (!player[k].onfire)player[k].CatchFire();
+ }
+ }
- for(int j=0;j<player[i].skeleton.num_joints;j++){
- player[i].skeleton.joints[j].velocity=player[i].skeleton.joints[j].velocity/5+player[k].velocity;
- }
- for(int j=0;j<player[k].skeleton.num_joints;j++){
- player[k].skeleton.joints[j].velocity=player[k].skeleton.joints[j].velocity/5+player[i].velocity;
- }
+ XYZ tempcoords1 = player[i].coords;
+ XYZ tempcoords2 = player[k].coords;
+ if (!player[i].skeleton.oldfree)
+ tempcoords1.y += player[i].jointPos(abdomen).y * player[i].scale;
+ if (!player[k].skeleton.oldfree)
+ tempcoords2.y += player[k].jointPos(abdomen).y * player[k].scale;
+ collisionradius = 1.2 * sq((player[i].scale + player[k].scale) * 2.5);
+ if (player[0].hasvictim)
+ if (player[0].animTarget == rabbitkickanim && (k == 0 || i == 0) && !player[0].victim->skeleton.free)
+ collisionradius = 3;
+ if ((!player[i].skeleton.oldfree || !player[k].skeleton.oldfree) &&
+ (distsq(&tempcoords1, &tempcoords2) < collisionradius ||
+ distsq(&player[i].coords, &player[k].coords) < collisionradius)) {
+ //jump down on a dead body
+ if (k == 0 || i == 0) {
+ int l = i ? i : k;
+ if (player[0].animTarget == jumpdownanim &&
+ !player[0].skeleton.oldfree &&
+ !player[0].skeleton.free &&
+ player[l].skeleton.oldfree &&
+ player[l].skeleton.free &&
+ player[l].dead &&
+ player[0].lastcollide <= 0 &&
+ fabs(player[l].coords.y - player[0].coords.y) < .2 &&
+ distsq(&player[0].coords, &player[l].coords) < .7 * sq((player[l].scale + player[0].scale) * 2.5)) {
+ player[0].coords.y = player[l].coords.y;
+ player[l].velocity = player[0].velocity;
+ player[l].skeleton.free = 0;
+ player[l].yaw = 0;
+ player[l].RagDoll(0);
+ player[l].DoDamage(20);
+ camerashake += .3;
+ player[l].skeleton.longdead = 0;
+ player[0].lastcollide = 1;
+ }
+ }
- }
- }
- if( (animation[player[i].animTarget].attack==neutral||
- animation[player[i].animTarget].attack==normalattack)&&
- (animation[player[k].animTarget].attack==neutral||
- animation[player[k].animTarget].attack==normalattack)){
- //If bumped
- if(player[i].skeleton.oldfree==0&&player[k].skeleton.oldfree==0){
- if(distsq(&player[k].coords,&player[i].coords)<.5*sq((player[i].scale+player[k].scale)*2.5)){
- rotatetarget=player[k].coords-player[i].coords;
- Normalise(&rotatetarget);
- player[k].coords=(player[k].coords+player[i].coords)/2;
- player[i].coords=player[k].coords-rotatetarget*fast_sqrt(.6)/2
- *sq((player[i].scale+player[k].scale)*2.5);
- player[k].coords+=rotatetarget*fast_sqrt(.6)/2*sq((player[i].scale+player[k].scale)*2.5);
- if(player[k].howactive==typeactive||hostile)
- if(player[k].isIdle()){
- if(player[k].howactive<typesleeping)
- player[k].setAnimation(player[k].getStop());
- else if(player[k].howactive==typesleeping)
- player[k].setAnimation(getupfromfrontanim);
- if(!editorenabled)
- player[k].howactive=typeactive;
- }
- if(player[i].howactive==typeactive||hostile)
- if(player[i].isIdle()){
- if(player[i].howactive<typesleeping)
- player[i].setAnimation(player[k].getStop());
- else
- player[i].setAnimation(getupfromfrontanim);
- if(!editorenabled)
- player[i].howactive=typeactive;
- }
- }
- //jump down on player
- if(hostile){
- if(k==0&&i!=0&&player[k].animTarget==jumpdownanim&&
- !player[i].isCrouch()&&
- player[i].animTarget!=rollanim&&
- !player[k].skeleton.oldfree&&!
- player[k].skeleton.free&&
- player[k].lastcollide<=0&&
- player[k].velocity.y<-10){
- player[i].velocity=player[k].velocity;
- player[k].velocity=player[k].velocity*-.5;
- player[k].velocity.y=player[i].velocity.y;
- player[i].DoDamage(20);
- player[i].RagDoll(0);
- player[k].lastcollide=1;
- award_bonus(k, AboveBonus);
- }
- if(i==0&&k!=0&&player[i].animTarget==jumpdownanim&&
- !player[k].isCrouch()&&
- player[k].animTarget!=rollanim&&
- !player[i].skeleton.oldfree&&
- !player[i].skeleton.free&&
- player[i].lastcollide<=0&&
- player[i].velocity.y<-10){
- player[k].velocity=player[i].velocity;
- player[i].velocity=player[i].velocity*-.3;
- player[i].velocity.y=player[k].velocity.y;
- player[k].DoDamage(20);
- player[k].RagDoll(0);
- player[i].lastcollide=1;
- award_bonus(i, AboveBonus);
- }
- }
- }
- }
- }
- player[i].CheckKick();
- player[k].CheckKick();
- }
- }
+ if ( (player[i].skeleton.oldfree == 1 && findLengthfast(&player[i].velocity) > 1) ||
+ (player[k].skeleton.oldfree == 1 && findLengthfast(&player[k].velocity) > 1) ||
+ (player[i].skeleton.oldfree == 0 && player[k].skeleton.oldfree == 0)) {
+ rotatetarget = player[k].velocity - player[i].velocity;
+ if ((player[i].animTarget != getupfrombackanim && player[i].animTarget != getupfromfrontanim ||
+ player[i].skeleton.free) &&
+ (player[k].animTarget != getupfrombackanim && player[k].animTarget != getupfromfrontanim ||
+ player[k].skeleton.free))
+ if ((((k != 0 && findLengthfast(&rotatetarget) > 150 ||
+ k == 0 && findLengthfast(&rotatetarget) > 50 && player[0].rabbitkickragdoll) &&
+ normaldotproduct(rotatetarget, player[k].coords - player[i].coords) > 0) &&
+ (k == 0 ||
+ k != 0 && player[i].skeleton.oldfree == 1 && animation[player[k].animCurrent].attack == neutral ||
+ /*i!=0&&*/player[k].skeleton.oldfree == 1 && animation[player[i].animCurrent].attack == neutral)) ||
+ (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) &&
+ (player[k].animTarget == jumpupanim || player[k].animTarget == jumpdownanim || player[k].isFlip()) &&
+ k == 0 && !player[i].skeleton.oldfree && !player[k].skeleton.oldfree) {
+ //If hit by body
+ if ( (i != 0 || player[i].skeleton.free) &&
+ (k != 0 || player[k].skeleton.free) ||
+ (animation[player[i].animTarget].height == highheight &&
+ animation[player[k].animTarget].height == highheight)) {
+ if (tutoriallevel != 1) {
+ emit_sound_at(heavyimpactsound, player[i].coords);
+ }
+
+ player[i].RagDoll(0);
+ if (player[i].damage > player[i].damagetolerance - findLengthfast(&rotatetarget) / 4 && !player[i].dead) {
+ award_bonus(0, aimbonus);
+ }
+ player[i].DoDamage(findLengthfast(&rotatetarget) / 4);
+ player[k].RagDoll(0);
+ if (player[k].damage > player[k].damagetolerance - findLengthfast(&rotatetarget) / 4 && !player[k].dead) {
+ award_bonus(0, aimbonus); // Huh, again?
+ }
+ player[k].DoDamage(findLengthfast(&rotatetarget) / 4);
+
+ for (int j = 0; j < player[i].skeleton.num_joints; j++) {
+ player[i].skeleton.joints[j].velocity = player[i].skeleton.joints[j].velocity / 5 + player[k].velocity;
+ }
+ for (int j = 0; j < player[k].skeleton.num_joints; j++) {
+ player[k].skeleton.joints[j].velocity = player[k].skeleton.joints[j].velocity / 5 + player[i].velocity;
+ }
+
+ }
+ }
+ if ( (animation[player[i].animTarget].attack == neutral ||
+ animation[player[i].animTarget].attack == normalattack) &&
+ (animation[player[k].animTarget].attack == neutral ||
+ animation[player[k].animTarget].attack == normalattack)) {
+ //If bumped
+ if (player[i].skeleton.oldfree == 0 && player[k].skeleton.oldfree == 0) {
+ if (distsq(&player[k].coords, &player[i].coords) < .5 * sq((player[i].scale + player[k].scale) * 2.5)) {
+ rotatetarget = player[k].coords - player[i].coords;
+ Normalise(&rotatetarget);
+ player[k].coords = (player[k].coords + player[i].coords) / 2;
+ player[i].coords = player[k].coords - rotatetarget * fast_sqrt(.6) / 2
+ * sq((player[i].scale + player[k].scale) * 2.5);
+ player[k].coords += rotatetarget * fast_sqrt(.6) / 2 * sq((player[i].scale + player[k].scale) * 2.5);
+ if (player[k].howactive == typeactive || hostile)
+ if (player[k].isIdle()) {
+ if (player[k].howactive < typesleeping)
+ player[k].setAnimation(player[k].getStop());
+ else if (player[k].howactive == typesleeping)
+ player[k].setAnimation(getupfromfrontanim);
+ if (!editorenabled)
+ player[k].howactive = typeactive;
+ }
+ if (player[i].howactive == typeactive || hostile)
+ if (player[i].isIdle()) {
+ if (player[i].howactive < typesleeping)
+ player[i].setAnimation(player[k].getStop());
+ else
+ player[i].setAnimation(getupfromfrontanim);
+ if (!editorenabled)
+ player[i].howactive = typeactive;
+ }
+ }
+ //jump down on player
+ if (hostile) {
+ if (k == 0 && i != 0 && player[k].animTarget == jumpdownanim &&
+ !player[i].isCrouch() &&
+ player[i].animTarget != rollanim &&
+ !player[k].skeleton.oldfree && !
+ player[k].skeleton.free &&
+ player[k].lastcollide <= 0 &&
+ player[k].velocity.y < -10) {
+ player[i].velocity = player[k].velocity;
+ player[k].velocity = player[k].velocity * -.5;
+ player[k].velocity.y = player[i].velocity.y;
+ player[i].DoDamage(20);
+ player[i].RagDoll(0);
+ player[k].lastcollide = 1;
+ award_bonus(k, AboveBonus);
+ }
+ if (i == 0 && k != 0 && player[i].animTarget == jumpdownanim &&
+ !player[k].isCrouch() &&
+ player[k].animTarget != rollanim &&
+ !player[i].skeleton.oldfree &&
+ !player[i].skeleton.free &&
+ player[i].lastcollide <= 0 &&
+ player[i].velocity.y < -10) {
+ player[k].velocity = player[i].velocity;
+ player[i].velocity = player[i].velocity * -.3;
+ player[i].velocity.y = player[k].velocity.y;
+ player[k].DoDamage(20);
+ player[k].RagDoll(0);
+ player[i].lastcollide = 1;
+ award_bonus(i, AboveBonus);
+ }
+ }
+ }
+ }
+ }
+ player[i].CheckKick();
+ player[k].CheckKick();
+ }
+ }
}
}
-void doAI(int i){
+void doAI(int i)
+{
static bool connected;
- if(player[i].aitype!=playercontrolled&&indialogue==-1){
- player[i].jumpclimb=0;
+ if (player[i].aitype != playercontrolled && indialogue == -1) {
+ player[i].jumpclimb = 0;
//disable movement in editor
- if(editorenabled)
- player[i].stunned=1;
+ if (editorenabled)
+ player[i].stunned = 1;
- player[i].pause=0;
- if(distsqflat(&player[0].coords,&player[i].coords)<30&&
- player[0].coords.y>player[i].coords.y+2&&
+ player[i].pause = 0;
+ if (distsqflat(&player[0].coords, &player[i].coords) < 30 &&
+ player[0].coords.y > player[i].coords.y + 2 &&
!player[0].onterrain)
- player[i].pause=1;
+ player[i].pause = 1;
//pathfinding
- if(player[i].aitype==pathfindtype){
- if(player[i].finalpathfindpoint==-1){
+ if (player[i].aitype == pathfindtype) {
+ if (player[i].finalpathfindpoint == -1) {
float closestdistance;
float tempdist;
int closest;
XYZ colpoint;
- closest=-1;
- closestdistance=-1;
- for(int j=0;j<numpathpoints;j++)
- if(closest==-1||distsq(&player[i].finalfinaltarget,&pathpoint[j])<closestdistance){
- closestdistance=distsq(&player[i].finalfinaltarget,&pathpoint[j]);
- closest=j;
- player[i].finaltarget=pathpoint[j];
+ closest = -1;
+ closestdistance = -1;
+ for (int j = 0; j < numpathpoints; j++)
+ if (closest == -1 || distsq(&player[i].finalfinaltarget, &pathpoint[j]) < closestdistance) {
+ closestdistance = distsq(&player[i].finalfinaltarget, &pathpoint[j]);
+ closest = j;
+ player[i].finaltarget = pathpoint[j];
}
- player[i].finalpathfindpoint=closest;
- for(int j=0;j<numpathpoints;j++)
- for(int k=0;k<numpathpointconnect[j];k++){
- DistancePointLine(&player[i].finalfinaltarget, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist,&colpoint );
- if(sq(tempdist)<closestdistance)
- if(findDistance(&colpoint,&pathpoint[j])+findDistance(&colpoint,&pathpoint[pathpointconnect[j][k]])<
- findDistance(&pathpoint[j],&pathpoint[pathpointconnect[j][k]])+.1){
- closestdistance=sq(tempdist);
- closest=j;
- player[i].finaltarget=colpoint;
+ player[i].finalpathfindpoint = closest;
+ for (int j = 0; j < numpathpoints; j++)
+ for (int k = 0; k < numpathpointconnect[j]; k++) {
+ DistancePointLine(&player[i].finalfinaltarget, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist, &colpoint );
+ if (sq(tempdist) < closestdistance)
+ if (findDistance(&colpoint, &pathpoint[j]) + findDistance(&colpoint, &pathpoint[pathpointconnect[j][k]]) <
+ findDistance(&pathpoint[j], &pathpoint[pathpointconnect[j][k]]) + .1) {
+ closestdistance = sq(tempdist);
+ closest = j;
+ player[i].finaltarget = colpoint;
}
}
- player[i].finalpathfindpoint=closest;
+ player[i].finalpathfindpoint = closest;
}
- if(player[i].targetpathfindpoint==-1){
+ if (player[i].targetpathfindpoint == -1) {
float closestdistance;
float tempdist;
int closest;
XYZ colpoint;
- closest=-1;
- closestdistance=-1;
- if(player[i].lastpathfindpoint==-1){
- for(int j=0;j<numpathpoints;j++){
- if(j!=player[i].lastpathfindpoint)
- if(closest==-1||(distsq(&player[i].coords,&pathpoint[j])<closestdistance)){
- closestdistance=distsq(&player[i].coords,&pathpoint[j]);
- closest=j;
+ closest = -1;
+ closestdistance = -1;
+ if (player[i].lastpathfindpoint == -1) {
+ for (int j = 0; j < numpathpoints; j++) {
+ if (j != player[i].lastpathfindpoint)
+ if (closest == -1 || (distsq(&player[i].coords, &pathpoint[j]) < closestdistance)) {
+ closestdistance = distsq(&player[i].coords, &pathpoint[j]);
+ closest = j;
}
}
- player[i].targetpathfindpoint=closest;
- for(int j=0;j<numpathpoints;j++)
- if(j!=player[i].lastpathfindpoint)
- for(int k=0;k<numpathpointconnect[j];k++){
- DistancePointLine(&player[i].coords, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist,&colpoint );
- if(sq(tempdist)<closestdistance){
- if(findDistance(&colpoint,&pathpoint[j])+findDistance(&colpoint,&pathpoint[pathpointconnect[j][k]])<
- findDistance(&pathpoint[j],&pathpoint[pathpointconnect[j][k]])+.1){
- closestdistance=sq(tempdist);
- closest=j;
+ player[i].targetpathfindpoint = closest;
+ for (int j = 0; j < numpathpoints; j++)
+ if (j != player[i].lastpathfindpoint)
+ for (int k = 0; k < numpathpointconnect[j]; k++) {
+ DistancePointLine(&player[i].coords, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist, &colpoint );
+ if (sq(tempdist) < closestdistance) {
+ if (findDistance(&colpoint, &pathpoint[j]) + findDistance(&colpoint, &pathpoint[pathpointconnect[j][k]]) <
+ findDistance(&pathpoint[j], &pathpoint[pathpointconnect[j][k]]) + .1) {
+ closestdistance = sq(tempdist);
+ closest = j;
}
}
}
- player[i].targetpathfindpoint=closest;
- }
- else
- {
- for(int j=0;j<numpathpoints;j++)
- if(j!=player[i].lastpathfindpoint&&
- j!=player[i].lastpathfindpoint2&&
- j!=player[i].lastpathfindpoint3&&
- j!=player[i].lastpathfindpoint4){
- connected=0;
- if(numpathpointconnect[j])
- for(int k=0;k<numpathpointconnect[j];k++)
- if(pathpointconnect[j][k]==player[i].lastpathfindpoint)
- connected=1;
- if(!connected)
- if(numpathpointconnect[player[i].lastpathfindpoint])
- for(int k=0;k<numpathpointconnect[player[i].lastpathfindpoint];k++)
- if(pathpointconnect[player[i].lastpathfindpoint][k]==j)
- connected=1;
- if(connected){
- tempdist=findPathDist(j,player[i].finalpathfindpoint);
- if(closest==-1||tempdist<closestdistance){
- closestdistance=tempdist;
- closest=j;
+ player[i].targetpathfindpoint = closest;
+ } else {
+ for (int j = 0; j < numpathpoints; j++)
+ if (j != player[i].lastpathfindpoint &&
+ j != player[i].lastpathfindpoint2 &&
+ j != player[i].lastpathfindpoint3 &&
+ j != player[i].lastpathfindpoint4) {
+ connected = 0;
+ if (numpathpointconnect[j])
+ for (int k = 0; k < numpathpointconnect[j]; k++)
+ if (pathpointconnect[j][k] == player[i].lastpathfindpoint)
+ connected = 1;
+ if (!connected)
+ if (numpathpointconnect[player[i].lastpathfindpoint])
+ for (int k = 0; k < numpathpointconnect[player[i].lastpathfindpoint]; k++)
+ if (pathpointconnect[player[i].lastpathfindpoint][k] == j)
+ connected = 1;
+ if (connected) {
+ tempdist = findPathDist(j, player[i].finalpathfindpoint);
+ if (closest == -1 || tempdist < closestdistance) {
+ closestdistance = tempdist;
+ closest = j;
}
}
}
- player[i].targetpathfindpoint=closest;
+ player[i].targetpathfindpoint = closest;
}
}
- player[i].losupdatedelay-=multiplier;
+ player[i].losupdatedelay -= multiplier;
- player[i].targetyaw=roughDirectionTo(player[i].coords,pathpoint[player[i].targetpathfindpoint]);
- player[i].lookyaw=player[i].targetyaw;
+ player[i].targetyaw = roughDirectionTo(player[i].coords, pathpoint[player[i].targetpathfindpoint]);
+ player[i].lookyaw = player[i].targetyaw;
//reached target point
- if(distsqflat(&player[i].coords,&pathpoint[player[i].targetpathfindpoint])<.6){
- player[i].lastpathfindpoint4=player[i].lastpathfindpoint3;
- player[i].lastpathfindpoint3=player[i].lastpathfindpoint2;
- player[i].lastpathfindpoint2=player[i].lastpathfindpoint;
- player[i].lastpathfindpoint=player[i].targetpathfindpoint;
- if(player[i].lastpathfindpoint2==-1)
- player[i].lastpathfindpoint2=player[i].lastpathfindpoint;
- if(player[i].lastpathfindpoint3==-1)
- player[i].lastpathfindpoint3=player[i].lastpathfindpoint2;
- if(player[i].lastpathfindpoint4==-1)
- player[i].lastpathfindpoint4=player[i].lastpathfindpoint3;
- player[i].targetpathfindpoint=-1;
- }
- if( distsqflat(&player[i].coords,&player[i].finalfinaltarget)<
- distsqflat(&player[i].coords,&player[i].finaltarget)||
- distsqflat(&player[i].coords,&player[i].finaltarget)<.6*sq(player[i].scale*5)||
- player[i].lastpathfindpoint==player[i].finalpathfindpoint) {
- player[i].aitype=passivetype;
- }
-
- player[i].forwardkeydown=1;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
- player[i].throwkeydown=0;
-
- if(player[i].avoidcollided>.8 && !player[i].jumpkeydown && player[i].collided<.8)
- player[i].targetyaw+=90*(player[i].whichdirection*2-1);
-
- if(player[i].collided<1||player[i].animTarget!=jumpupanim)
- player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))
- player[i].jumpkeydown=1;
-
- if((tutoriallevel!=1||cananger)&&
- hostile&&
- !player[0].dead&&
- distsq(&player[i].coords,&player[0].coords)<400&&
- player[i].occluded<25){
- if(distsq(&player[i].coords,&player[0].coords)<12&&
- animation[player[0].animTarget].height!=lowheight&&
- !editorenabled&&
- (player[0].coords.y<player[i].coords.y+5||player[0].onterrain))
- player[i].aitype=attacktypecutoff;
- if(distsq(&player[i].coords,&player[0].coords)<30&&
- animation[player[0].animTarget].height==highheight&&
+ if (distsqflat(&player[i].coords, &pathpoint[player[i].targetpathfindpoint]) < .6) {
+ player[i].lastpathfindpoint4 = player[i].lastpathfindpoint3;
+ player[i].lastpathfindpoint3 = player[i].lastpathfindpoint2;
+ player[i].lastpathfindpoint2 = player[i].lastpathfindpoint;
+ player[i].lastpathfindpoint = player[i].targetpathfindpoint;
+ if (player[i].lastpathfindpoint2 == -1)
+ player[i].lastpathfindpoint2 = player[i].lastpathfindpoint;
+ if (player[i].lastpathfindpoint3 == -1)
+ player[i].lastpathfindpoint3 = player[i].lastpathfindpoint2;
+ if (player[i].lastpathfindpoint4 == -1)
+ player[i].lastpathfindpoint4 = player[i].lastpathfindpoint3;
+ player[i].targetpathfindpoint = -1;
+ }
+ if ( distsqflat(&player[i].coords, &player[i].finalfinaltarget) <
+ distsqflat(&player[i].coords, &player[i].finaltarget) ||
+ distsqflat(&player[i].coords, &player[i].finaltarget) < .6 * sq(player[i].scale * 5) ||
+ player[i].lastpathfindpoint == player[i].finalpathfindpoint) {
+ player[i].aitype = passivetype;
+ }
+
+ player[i].forwardkeydown = 1;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].attackkeydown = 0;
+ player[i].throwkeydown = 0;
+
+ if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8)
+ player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+
+ if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+ player[i].jumpkeydown = 0;
+ if ((player[i].collided > .8 && player[i].jumppower >= 5))
+ player[i].jumpkeydown = 1;
+
+ if ((tutoriallevel != 1 || cananger) &&
+ hostile &&
+ !player[0].dead &&
+ distsq(&player[i].coords, &player[0].coords) < 400 &&
+ player[i].occluded < 25) {
+ if (distsq(&player[i].coords, &player[0].coords) < 12 &&
+ animation[player[0].animTarget].height != lowheight &&
+ !editorenabled &&
+ (player[0].coords.y < player[i].coords.y + 5 || player[0].onterrain))
+ player[i].aitype = attacktypecutoff;
+ if (distsq(&player[i].coords, &player[0].coords) < 30 &&
+ animation[player[0].animTarget].height == highheight &&
!editorenabled)
- player[i].aitype=attacktypecutoff;
-
- if(player[i].losupdatedelay<0&&!editorenabled&&player[i].occluded<2){
- player[i].losupdatedelay=.2;
- for(int j=0;j<numplayers;j++)
- if(j==0||player[j].skeleton.free||player[j].aitype!=passivetype)
- if(abs(Random()%2)||animation[player[j].animTarget].height!=lowheight||j!=0)
- if(distsq(&player[i].coords,&player[j].coords)<400)
- if(normaldotproduct(player[i].facing,player[j].coords-player[i].coords)>0)
- if(player[j].coords.y<player[i].coords.y+5||player[j].onterrain)
- if(!player[j].isWallJump()&&-1==checkcollide(
- DoRotation(player[i].jointPos(head),0,player[i].yaw,0)
- *player[i].scale+player[i].coords,
- DoRotation(player[j].jointPos(head),0,player[j].yaw,0)
- *player[j].scale+player[j].coords)||
- (player[j].animTarget==hanganim&&
- normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){
- player[i].aitype=searchtype;
- player[i].lastchecktime=12;
- player[i].lastseen=player[j].coords;
- player[i].lastseentime=12;
+ player[i].aitype = attacktypecutoff;
+
+ if (player[i].losupdatedelay < 0 && !editorenabled && player[i].occluded < 2) {
+ player[i].losupdatedelay = .2;
+ for (int j = 0; j < numplayers; j++)
+ if (j == 0 || player[j].skeleton.free || player[j].aitype != passivetype)
+ if (abs(Random() % 2) || animation[player[j].animTarget].height != lowheight || j != 0)
+ if (distsq(&player[i].coords, &player[j].coords) < 400)
+ if (normaldotproduct(player[i].facing, player[j].coords - player[i].coords) > 0)
+ if (player[j].coords.y < player[i].coords.y + 5 || player[j].onterrain)
+ if (!player[j].isWallJump() && -1 == checkcollide(
+ DoRotation(player[i].jointPos(head), 0, player[i].yaw, 0)
+ *player[i].scale + player[i].coords,
+ DoRotation(player[j].jointPos(head), 0, player[j].yaw, 0)
+ *player[j].scale + player[j].coords) ||
+ (player[j].animTarget == hanganim &&
+ normaldotproduct(player[j].facing, player[i].coords - player[j].coords) < 0)) {
+ player[i].aitype = searchtype;
+ player[i].lastchecktime = 12;
+ player[i].lastseen = player[j].coords;
+ player[i].lastseentime = 12;
}
}
}
- if(player[i].aitype==attacktypecutoff&&musictype!=2)
- if(player[i].creature!=wolftype){
- player[i].stunned=.6;
- player[i].surprised=.6;
+ if (player[i].aitype == attacktypecutoff && musictype != 2)
+ if (player[i].creature != wolftype) {
+ player[i].stunned = .6;
+ player[i].surprised = .6;
}
}
- if(player[i].aitype!=passivetype&&leveltime>.5)
- player[i].howactive=typeactive;
-
- if(player[i].aitype==passivetype){
- player[i].aiupdatedelay-=multiplier;
- player[i].losupdatedelay-=multiplier;
- player[i].lastseentime+=multiplier;
- player[i].pausetime-=multiplier;
- if(player[i].lastseentime>1)
- player[i].lastseentime=1;
-
- if(player[i].aiupdatedelay<0){
- if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0){
- player[i].targetyaw=roughDirectionTo(player[i].coords,player[i].waypoints[player[i].waypoint]);
- player[i].lookyaw=player[i].targetyaw;
- player[i].aiupdatedelay=.05;
-
- if(distsqflat(&player[i].coords,&player[i].waypoints[player[i].waypoint])<1){
- if(player[i].waypointtype[player[i].waypoint]==wppause)
- player[i].pausetime=4;
+ if (player[i].aitype != passivetype && leveltime > .5)
+ player[i].howactive = typeactive;
+
+ if (player[i].aitype == passivetype) {
+ player[i].aiupdatedelay -= multiplier;
+ player[i].losupdatedelay -= multiplier;
+ player[i].lastseentime += multiplier;
+ player[i].pausetime -= multiplier;
+ if (player[i].lastseentime > 1)
+ player[i].lastseentime = 1;
+
+ if (player[i].aiupdatedelay < 0) {
+ if (player[i].numwaypoints > 1 && player[i].howactive == typeactive && player[i].pausetime <= 0) {
+ player[i].targetyaw = roughDirectionTo(player[i].coords, player[i].waypoints[player[i].waypoint]);
+ player[i].lookyaw = player[i].targetyaw;
+ player[i].aiupdatedelay = .05;
+
+ if (distsqflat(&player[i].coords, &player[i].waypoints[player[i].waypoint]) < 1) {
+ if (player[i].waypointtype[player[i].waypoint] == wppause)
+ player[i].pausetime = 4;
player[i].waypoint++;
- if(player[i].waypoint>player[i].numwaypoints-1)
- player[i].waypoint=0;
+ if (player[i].waypoint > player[i].numwaypoints - 1)
+ player[i].waypoint = 0;
}
}
- if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0)
- player[i].forwardkeydown=1;
+ if (player[i].numwaypoints > 1 && player[i].howactive == typeactive && player[i].pausetime <= 0)
+ player[i].forwardkeydown = 1;
else
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
- player[i].throwkeydown=0;
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
- if(!player[i].avoidsomething)
- player[i].targetyaw+=90*(player[i].whichdirection*2-1);
- else{
- XYZ leftpos,rightpos;
- float leftdist,rightdist;
- leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
- rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
+ player[i].forwardkeydown = 0;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].attackkeydown = 0;
+ player[i].throwkeydown = 0;
+
+ if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8) {
+ if (!player[i].avoidsomething)
+ player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+ else {
+ XYZ leftpos, rightpos;
+ float leftdist, rightdist;
+ leftpos = player[i].coords + DoRotation(player[i].facing, 0, 90, 0);
+ rightpos = player[i].coords - DoRotation(player[i].facing, 0, 90, 0);
leftdist = distsq(&leftpos, &player[i].avoidwhere);
rightdist = distsq(&rightpos, &player[i].avoidwhere);
- if(leftdist<rightdist)
- player[i].targetyaw+=90;
+ if (leftdist < rightdist)
+ player[i].targetyaw += 90;
else
- player[i].targetyaw-=90;
+ player[i].targetyaw -= 90;
}
}
}
- if(player[i].collided<1||player[i].animTarget!=jumpupanim)
- player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))
- player[i].jumpkeydown=1;
+ if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+ player[i].jumpkeydown = 0;
+ if ((player[i].collided > .8 && player[i].jumppower >= 5))
+ player[i].jumpkeydown = 1;
//hearing sounds
- if(!editorenabled){
- if(player[i].howactive<=typesleeping)
- if(numenvsounds>0&&(tutoriallevel!=1||cananger)&&hostile)
- for(int j=0;j<numenvsounds;j++){
- float vol=player[i].howactive==typesleeping?envsoundvol[j]-14:envsoundvol[j];
- if(vol>0&&distsq(&player[i].coords,&envsound[j])<
- 2*(vol+vol*(player[i].creature==rabbittype)*3))
- player[i].aitype=attacktypecutoff;
+ if (!editorenabled) {
+ if (player[i].howactive <= typesleeping)
+ if (numenvsounds > 0 && (tutoriallevel != 1 || cananger) && hostile)
+ for (int j = 0; j < numenvsounds; j++) {
+ float vol = player[i].howactive == typesleeping ? envsoundvol[j] - 14 : envsoundvol[j];
+ if (vol > 0 && distsq(&player[i].coords, &envsound[j]) <
+ 2 * (vol + vol * (player[i].creature == rabbittype) * 3))
+ player[i].aitype = attacktypecutoff;
}
- if(player[i].aitype!=passivetype){
- if(player[i].howactive==typesleeping)
+ if (player[i].aitype != passivetype) {
+ if (player[i].howactive == typesleeping)
player[i].setAnimation(getupfromfrontanim);
- player[i].howactive=typeactive;
+ player[i].howactive = typeactive;
}
}
- if(player[i].howactive<typesleeping&&
- ((tutoriallevel!=1||cananger)&&hostile)&&
- !player[0].dead&&
- distsq(&player[i].coords,&player[0].coords)<400&&
- player[i].occluded<25){
- if(distsq(&player[i].coords,&player[0].coords)<12&&
- animation[player[0].animTarget].height!=lowheight&&!editorenabled)
- player[i].aitype=attacktypecutoff;
- if(distsq(&player[i].coords,&player[0].coords)<30&&
- animation[player[0].animTarget].height==highheight&&!editorenabled)
- player[i].aitype=attacktypecutoff;
+ if (player[i].howactive < typesleeping &&
+ ((tutoriallevel != 1 || cananger) && hostile) &&
+ !player[0].dead &&
+ distsq(&player[i].coords, &player[0].coords) < 400 &&
+ player[i].occluded < 25) {
+ if (distsq(&player[i].coords, &player[0].coords) < 12 &&
+ animation[player[0].animTarget].height != lowheight && !editorenabled)
+ player[i].aitype = attacktypecutoff;
+ if (distsq(&player[i].coords, &player[0].coords) < 30 &&
+ animation[player[0].animTarget].height == highheight && !editorenabled)
+ player[i].aitype = attacktypecutoff;
//wolf smell
- if(player[i].creature==wolftype){
+ if (player[i].creature == wolftype) {
XYZ windsmell;
- for(int j=0;j<numplayers;j++){
- if(j==0||(player[j].dead&&player[j].bloodloss>0)){
- float smelldistance=50;
- if(j==0&&player[j].num_weapons>0){
- if(weapons[player[j].weaponids[0]].bloody)
- smelldistance=100;
- if(player[j].num_weapons==2)
- if(weapons[player[j].weaponids[1]].bloody)
- smelldistance=100;
+ for (int j = 0; j < numplayers; j++) {
+ if (j == 0 || (player[j].dead && player[j].bloodloss > 0)) {
+ float smelldistance = 50;
+ if (j == 0 && player[j].num_weapons > 0) {
+ if (weapons[player[j].weaponids[0]].bloody)
+ smelldistance = 100;
+ if (player[j].num_weapons == 2)
+ if (weapons[player[j].weaponids[1]].bloody)
+ smelldistance = 100;
}
- if(j!=0)
- smelldistance=100;
- windsmell=windvector;
+ if (j != 0)
+ smelldistance = 100;
+ windsmell = windvector;
Normalise(&windsmell);
- windsmell=windsmell*2+player[j].coords;
- if(distsq(&player[i].coords,&windsmell)<smelldistance&&!editorenabled)
- player[i].aitype=attacktypecutoff;
+ windsmell = windsmell * 2 + player[j].coords;
+ if (distsq(&player[i].coords, &windsmell) < smelldistance && !editorenabled)
+ player[i].aitype = attacktypecutoff;
}
}
}
- if(player[i].howactive<typesleeping&&player[i].losupdatedelay<0&&!editorenabled&&player[i].occluded<2){
- player[i].losupdatedelay=.2;
- for(int j=0;j<numplayers;j++){
- if(j==0||player[j].skeleton.free||player[j].aitype!=passivetype){
- if(abs(Random()%2)||animation[player[j].animTarget].height!=lowheight||j!=0)
- if(distsq(&player[i].coords,&player[j].coords)<400)
- if(normaldotproduct(player[i].facing,player[j].coords-player[i].coords)>0)
- if((-1==checkcollide(
- DoRotation(player[i].jointPos(head),0,player[i].yaw,0)*
- player[i].scale+player[i].coords,
- DoRotation(player[j].jointPos(head),0,player[j].yaw,0)*
- player[j].scale+player[j].coords)&&
- !player[j].isWallJump())||
- (player[j].animTarget==hanganim&&
- normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){
- player[i].lastseentime-=.2;
- if(j==0&&animation[player[j].animTarget].height==lowheight)
- player[i].lastseentime-=.4;
+ if (player[i].howactive < typesleeping && player[i].losupdatedelay < 0 && !editorenabled && player[i].occluded < 2) {
+ player[i].losupdatedelay = .2;
+ for (int j = 0; j < numplayers; j++) {
+ if (j == 0 || player[j].skeleton.free || player[j].aitype != passivetype) {
+ if (abs(Random() % 2) || animation[player[j].animTarget].height != lowheight || j != 0)
+ if (distsq(&player[i].coords, &player[j].coords) < 400)
+ if (normaldotproduct(player[i].facing, player[j].coords - player[i].coords) > 0)
+ if ((-1 == checkcollide(
+ DoRotation(player[i].jointPos(head), 0, player[i].yaw, 0)*
+ player[i].scale + player[i].coords,
+ DoRotation(player[j].jointPos(head), 0, player[j].yaw, 0)*
+ player[j].scale + player[j].coords) &&
+ !player[j].isWallJump()) ||
+ (player[j].animTarget == hanganim &&
+ normaldotproduct(player[j].facing, player[i].coords - player[j].coords) < 0)) {
+ player[i].lastseentime -= .2;
+ if (j == 0 && animation[player[j].animTarget].height == lowheight)
+ player[i].lastseentime -= .4;
else
- player[i].lastseentime-=.6;
+ player[i].lastseentime -= .6;
}
- if(player[i].lastseentime<=0){
- player[i].aitype=searchtype;
- player[i].lastchecktime=12;
- player[i].lastseen=player[j].coords;
- player[i].lastseentime=12;
+ if (player[i].lastseentime <= 0) {
+ player[i].aitype = searchtype;
+ player[i].lastchecktime = 12;
+ player[i].lastseen = player[j].coords;
+ player[i].lastseentime = 12;
}
}
}
}
}
//alerted surprise
- if(player[i].aitype==attacktypecutoff&&musictype!=2){
- if(player[i].creature!=wolftype){
- player[i].stunned=.6;
- player[i].surprised=.6;
+ if (player[i].aitype == attacktypecutoff && musictype != 2) {
+ if (player[i].creature != wolftype) {
+ player[i].stunned = .6;
+ player[i].surprised = .6;
}
- if(player[i].creature==wolftype){
- player[i].stunned=.47;
- player[i].surprised=.47;
+ if (player[i].creature == wolftype) {
+ player[i].stunned = .47;
+ player[i].surprised = .47;
}
numseen++;
}
//search for player
int j;
- if(player[i].aitype==searchtype){
- player[i].aiupdatedelay-=multiplier;
- player[i].losupdatedelay-=multiplier;
- if(!player[i].pause)
- player[i].lastseentime-=multiplier;
- player[i].lastchecktime-=multiplier;
-
- if(player[i].isRun()&&!player[i].onground){
- if(player[i].coords.y>terrain.getHeight(player[i].coords.x,player[i].coords.z)+10){
- XYZ test2=player[i].coords+player[i].facing;
- test2.y+=5;
- XYZ test=player[i].coords+player[i].facing;
- test.y-=10;
- j=checkcollide(test2,test,player[i].laststanding);
- if(j==-1)
- j=checkcollide(test2,test);
- if(j==-1){
- player[i].velocity=0;
+ if (player[i].aitype == searchtype) {
+ player[i].aiupdatedelay -= multiplier;
+ player[i].losupdatedelay -= multiplier;
+ if (!player[i].pause)
+ player[i].lastseentime -= multiplier;
+ player[i].lastchecktime -= multiplier;
+
+ if (player[i].isRun() && !player[i].onground) {
+ if (player[i].coords.y > terrain.getHeight(player[i].coords.x, player[i].coords.z) + 10) {
+ XYZ test2 = player[i].coords + player[i].facing;
+ test2.y += 5;
+ XYZ test = player[i].coords + player[i].facing;
+ test.y -= 10;
+ j = checkcollide(test2, test, player[i].laststanding);
+ if (j == -1)
+ j = checkcollide(test2, test);
+ if (j == -1) {
+ player[i].velocity = 0;
player[i].setAnimation(player[i].getStop());
- player[i].targetyaw+=180;
- player[i].stunned=.5;
+ player[i].targetyaw += 180;
+ player[i].stunned = .5;
//player[i].aitype=passivetype;
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
- }
- else player[i].laststanding=j;
+ player[i].aitype = pathfindtype;
+ player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+ player[i].finalpathfindpoint = -1;
+ player[i].targetpathfindpoint = -1;
+ player[i].lastpathfindpoint = -1;
+ player[i].lastpathfindpoint2 = -1;
+ player[i].lastpathfindpoint3 = -1;
+ player[i].lastpathfindpoint4 = -1;
+ } else player[i].laststanding = j;
}
}
//check out last seen location
- if(player[i].aiupdatedelay<0){
- player[i].targetyaw=roughDirectionTo(player[i].coords,player[i].lastseen);
- player[i].lookyaw=player[i].targetyaw;
- player[i].aiupdatedelay=.05;
- player[i].forwardkeydown=1;
-
- if(distsqflat(&player[i].coords,&player[i].lastseen)<1*sq(player[i].scale*5)||player[i].lastchecktime<0){
- player[i].forwardkeydown=0;
- player[i].aiupdatedelay=1;
- player[i].lastseen.x+=(float(Random()%100)-50)/25;
- player[i].lastseen.z+=(float(Random()%100)-50)/25;
- player[i].lastchecktime=3;
+ if (player[i].aiupdatedelay < 0) {
+ player[i].targetyaw = roughDirectionTo(player[i].coords, player[i].lastseen);
+ player[i].lookyaw = player[i].targetyaw;
+ player[i].aiupdatedelay = .05;
+ player[i].forwardkeydown = 1;
+
+ if (distsqflat(&player[i].coords, &player[i].lastseen) < 1 * sq(player[i].scale * 5) || player[i].lastchecktime < 0) {
+ player[i].forwardkeydown = 0;
+ player[i].aiupdatedelay = 1;
+ player[i].lastseen.x += (float(Random() % 100) - 50) / 25;
+ player[i].lastseen.z += (float(Random() % 100) - 50) / 25;
+ player[i].lastchecktime = 3;
}
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
- player[i].throwkeydown=0;
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
- if(!player[i].avoidsomething)player[i].targetyaw+=90*(player[i].whichdirection*2-1);
- else{
- XYZ leftpos,rightpos;
- float leftdist,rightdist;
- leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
- rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].attackkeydown = 0;
+ player[i].throwkeydown = 0;
+
+ if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8) {
+ if (!player[i].avoidsomething)player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+ else {
+ XYZ leftpos, rightpos;
+ float leftdist, rightdist;
+ leftpos = player[i].coords + DoRotation(player[i].facing, 0, 90, 0);
+ rightpos = player[i].coords - DoRotation(player[i].facing, 0, 90, 0);
leftdist = distsq(&leftpos, &player[i].avoidwhere);
rightdist = distsq(&rightpos, &player[i].avoidwhere);
- if(leftdist<rightdist)player[i].targetyaw+=90;
- else player[i].targetyaw-=90;
+ if (leftdist < rightdist)player[i].targetyaw += 90;
+ else player[i].targetyaw -= 90;
}
}
}
- if(player[i].collided<1||player[i].animTarget!=jumpupanim)
- player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))
- player[i].jumpkeydown=1;
-
- if(numenvsounds>0&&((tutoriallevel!=1||cananger)&&hostile))
- for(int k=0;k<numenvsounds;k++){
- if(distsq(&player[i].coords,&envsound[k])<2*(envsoundvol[k]+envsoundvol[k]*(player[i].creature==rabbittype)*3)){
- player[i].aitype=attacktypecutoff;
+ if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+ player[i].jumpkeydown = 0;
+ if ((player[i].collided > .8 && player[i].jumppower >= 5))
+ player[i].jumpkeydown = 1;
+
+ if (numenvsounds > 0 && ((tutoriallevel != 1 || cananger) && hostile))
+ for (int k = 0; k < numenvsounds; k++) {
+ if (distsq(&player[i].coords, &envsound[k]) < 2 * (envsoundvol[k] + envsoundvol[k] * (player[i].creature == rabbittype) * 3)) {
+ player[i].aitype = attacktypecutoff;
}
}
- if(!player[0].dead&&
- player[i].losupdatedelay<0&&
- !editorenabled&&
- player[i].occluded<2&&
- ((tutoriallevel!=1||cananger)&&hostile)){
- player[i].losupdatedelay=.2;
- if(distsq(&player[i].coords,&player[0].coords)<4&&animation[player[i].animTarget].height!=lowheight){
- player[i].aitype=attacktypecutoff;
- player[i].lastseentime=1;
+ if (!player[0].dead &&
+ player[i].losupdatedelay < 0 &&
+ !editorenabled &&
+ player[i].occluded < 2 &&
+ ((tutoriallevel != 1 || cananger) && hostile)) {
+ player[i].losupdatedelay = .2;
+ if (distsq(&player[i].coords, &player[0].coords) < 4 && animation[player[i].animTarget].height != lowheight) {
+ player[i].aitype = attacktypecutoff;
+ player[i].lastseentime = 1;
}
- if(abs(Random()%2)||animation[player[i].animTarget].height!=lowheight)
+ if (abs(Random() % 2) || animation[player[i].animTarget].height != lowheight)
//TODO: factor out canSeePlayer()
- if(distsq(&player[i].coords,&player[0].coords)<400)
- if(normaldotproduct(player[i].facing,player[0].coords-player[i].coords)>0)
- if((checkcollide(
- DoRotation(player[i].jointPos(head),0,player[i].yaw,0)*
- player[i].scale+player[i].coords,
- DoRotation(player[0].jointPos(head),0,player[0].yaw,0)*
- player[0].scale+player[0].coords)==-1)||
- (player[0].animTarget==hanganim&&normaldotproduct(
- player[0].facing,player[i].coords-player[0].coords)<0)){
- /* //TODO: changed j to 0 on a whim, make sure this is correct
- (player[j].animTarget==hanganim&&normaldotproduct(
- player[j].facing,player[i].coords-player[j].coords)<0)
- */
- player[i].aitype=attacktypecutoff;
- player[i].lastseentime=1;
+ if (distsq(&player[i].coords, &player[0].coords) < 400)
+ if (normaldotproduct(player[i].facing, player[0].coords - player[i].coords) > 0)
+ if ((checkcollide(
+ DoRotation(player[i].jointPos(head), 0, player[i].yaw, 0)*
+ player[i].scale + player[i].coords,
+ DoRotation(player[0].jointPos(head), 0, player[0].yaw, 0)*
+ player[0].scale + player[0].coords) == -1) ||
+ (player[0].animTarget == hanganim && normaldotproduct(
+ player[0].facing, player[i].coords - player[0].coords) < 0)) {
+ /* //TODO: changed j to 0 on a whim, make sure this is correct
+ (player[j].animTarget==hanganim&&normaldotproduct(
+ player[j].facing,player[i].coords-player[j].coords)<0)
+ */
+ player[i].aitype = attacktypecutoff;
+ player[i].lastseentime = 1;
}
}
//player escaped
- if(player[i].lastseentime<0){
+ if (player[i].lastseentime < 0) {
//player[i].aitype=passivetype;
numescaped++;
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
+ player[i].aitype = pathfindtype;
+ player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+ player[i].finalpathfindpoint = -1;
+ player[i].targetpathfindpoint = -1;
+ player[i].lastpathfindpoint = -1;
+ player[i].lastpathfindpoint2 = -1;
+ player[i].lastpathfindpoint3 = -1;
+ player[i].lastpathfindpoint4 = -1;
}
}
- if(player[i].aitype!=gethelptype)
- player[i].runninghowlong=0;
+ if (player[i].aitype != gethelptype)
+ player[i].runninghowlong = 0;
//get help from buddies
- if(player[i].aitype==gethelptype) {
- player[i].runninghowlong+=multiplier;
- player[i].aiupdatedelay-=multiplier;
+ if (player[i].aitype == gethelptype) {
+ player[i].runninghowlong += multiplier;
+ player[i].aiupdatedelay -= multiplier;
- if(player[i].aiupdatedelay<0||player[i].ally==0) {
- player[i].aiupdatedelay=.2;
+ if (player[i].aiupdatedelay < 0 || player[i].ally == 0) {
+ player[i].aiupdatedelay = .2;
//find closest ally
//TODO: factor out closest search somehow
- if(!player[i].ally) {
- int closest=-1;
- float closestdist=-1;
- for(int k=0;k<numplayers;k++) {
- if(k!=i&&k!=0&&!player[k].dead&&
- player[k].howactive<typedead1&&
- !player[k].skeleton.free&&
- player[k].aitype==passivetype) {
- float distance=distsq(&player[i].coords,&player[k].coords);
- if(closestdist==-1||distance<closestdist) {
- closestdist=distance;
- closest=k;
+ if (!player[i].ally) {
+ int closest = -1;
+ float closestdist = -1;
+ for (int k = 0; k < numplayers; k++) {
+ if (k != i && k != 0 && !player[k].dead &&
+ player[k].howactive < typedead1 &&
+ !player[k].skeleton.free &&
+ player[k].aitype == passivetype) {
+ float distance = distsq(&player[i].coords, &player[k].coords);
+ if (closestdist == -1 || distance < closestdist) {
+ closestdist = distance;
+ closest = k;
}
- closest=k;
+ closest = k;
}
}
- if(closest!=-1)
- player[i].ally=closest;
+ if (closest != -1)
+ player[i].ally = closest;
else
- player[i].ally=0;
- player[i].lastseen=player[0].coords;
- player[i].lastseentime=12;
+ player[i].ally = 0;
+ player[i].lastseen = player[0].coords;
+ player[i].lastseentime = 12;
}
- player[i].lastchecktime=12;
+ player[i].lastchecktime = 12;
- XYZ facing=player[i].coords;
- XYZ flatfacing=player[player[i].ally].coords;
- facing.y+=player[i].jointPos(head).y*player[i].scale;
- flatfacing.y+=player[player[i].ally].jointPos(head).y*player[player[i].ally].scale;
- if(-1!=checkcollide(facing,flatfacing))
- player[i].lastseentime-=.1;
+ XYZ facing = player[i].coords;
+ XYZ flatfacing = player[player[i].ally].coords;
+ facing.y += player[i].jointPos(head).y * player[i].scale;
+ flatfacing.y += player[player[i].ally].jointPos(head).y * player[player[i].ally].scale;
+ if (-1 != checkcollide(facing, flatfacing))
+ player[i].lastseentime -= .1;
//no available ally, run back to player
- if(player[i].ally<=0||
- player[player[i].ally].skeleton.free||
- player[player[i].ally].aitype!=passivetype||
- player[i].lastseentime<=0){
- player[i].aitype=searchtype;
- player[i].lastseentime=12;
+ if (player[i].ally <= 0 ||
+ player[player[i].ally].skeleton.free ||
+ player[player[i].ally].aitype != passivetype ||
+ player[i].lastseentime <= 0) {
+ player[i].aitype = searchtype;
+ player[i].lastseentime = 12;
}
//seek out ally
- if(player[i].ally>0){
- player[i].targetyaw=roughDirectionTo(player[i].coords,player[player[i].ally].coords);
- player[i].lookyaw=player[i].targetyaw;
- player[i].aiupdatedelay=.05;
- player[i].forwardkeydown=1;
-
- if(distsqflat(&player[i].coords,&player[player[i].ally].coords)<3){
- player[i].aitype=searchtype;
- player[i].lastseentime=12;
- player[player[i].ally].aitype=searchtype;
- if(player[player[i].ally].lastseentime<player[i].lastseentime){
- player[player[i].ally].lastseen=player[i].lastseen;
- player[player[i].ally].lastseentime=player[i].lastseentime;
- player[player[i].ally].lastchecktime=player[i].lastchecktime;
+ if (player[i].ally > 0) {
+ player[i].targetyaw = roughDirectionTo(player[i].coords, player[player[i].ally].coords);
+ player[i].lookyaw = player[i].targetyaw;
+ player[i].aiupdatedelay = .05;
+ player[i].forwardkeydown = 1;
+
+ if (distsqflat(&player[i].coords, &player[player[i].ally].coords) < 3) {
+ player[i].aitype = searchtype;
+ player[i].lastseentime = 12;
+ player[player[i].ally].aitype = searchtype;
+ if (player[player[i].ally].lastseentime < player[i].lastseentime) {
+ player[player[i].ally].lastseen = player[i].lastseen;
+ player[player[i].ally].lastseentime = player[i].lastseentime;
+ player[player[i].ally].lastchecktime = player[i].lastchecktime;
}
}
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
- if(!player[i].avoidsomething)
- player[i].targetyaw+=90*(player[i].whichdirection*2-1);
- else{
- XYZ leftpos,rightpos;
- float leftdist,rightdist;
- leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
- rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
+ if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8) {
+ if (!player[i].avoidsomething)
+ player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+ else {
+ XYZ leftpos, rightpos;
+ float leftdist, rightdist;
+ leftpos = player[i].coords + DoRotation(player[i].facing, 0, 90, 0);
+ rightpos = player[i].coords - DoRotation(player[i].facing, 0, 90, 0);
leftdist = distsq(&leftpos, &player[i].avoidwhere);
rightdist = distsq(&rightpos, &player[i].avoidwhere);
- if(leftdist<rightdist)
- player[i].targetyaw+=90;
+ if (leftdist < rightdist)
+ player[i].targetyaw += 90;
else
- player[i].targetyaw-=90;
+ player[i].targetyaw -= 90;
}
}
}
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].attackkeydown=0;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].attackkeydown = 0;
}
- if(player[i].collided<1||player[i].animTarget!=jumpupanim)
- player[i].jumpkeydown=0;
- if(player[i].collided>.8&&player[i].jumppower>=5)
- player[i].jumpkeydown=1;
+ if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+ player[i].jumpkeydown = 0;
+ if (player[i].collided > .8 && player[i].jumppower >= 5)
+ player[i].jumpkeydown = 1;
}
//retreiving a weapon on the ground
- if(player[i].aitype==getweapontype){
- player[i].aiupdatedelay-=multiplier;
- player[i].lastchecktime-=multiplier;
+ if (player[i].aitype == getweapontype) {
+ player[i].aiupdatedelay -= multiplier;
+ player[i].lastchecktime -= multiplier;
- if(player[i].aiupdatedelay<0){
- player[i].aiupdatedelay=.2;
+ if (player[i].aiupdatedelay < 0) {
+ player[i].aiupdatedelay = .2;
//ALLY IS WEPON
- if(player[i].ally<0){
- int closest=-1;
- float closestdist=-1;
- for(int k=0;k<weapons.size();k++)
- if(weapons[k].owner==-1){
- float distance=distsq(&player[i].coords,&weapons[k].position);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=k;
+ if (player[i].ally < 0) {
+ int closest = -1;
+ float closestdist = -1;
+ for (int k = 0; k < weapons.size(); k++)
+ if (weapons[k].owner == -1) {
+ float distance = distsq(&player[i].coords, &weapons[k].position);
+ if (closestdist == -1 || distance < closestdist) {
+ closestdist = distance;
+ closest = k;
}
- closest=k;
+ closest = k;
}
- if(closest!=-1)
- player[i].ally=closest;
+ if (closest != -1)
+ player[i].ally = closest;
else
- player[i].ally=-1;
+ player[i].ally = -1;
}
- player[i].lastseentime=12;
+ player[i].lastseentime = 12;
- if(!player[0].dead&&((tutoriallevel!=1||cananger)&&hostile))
- if(player[i].ally<0||player[i].weaponactive!=-1||player[i].lastchecktime<=0){
- player[i].aitype=attacktypecutoff;
- player[i].lastseentime=1;
+ if (!player[0].dead && ((tutoriallevel != 1 || cananger) && hostile))
+ if (player[i].ally < 0 || player[i].weaponactive != -1 || player[i].lastchecktime <= 0) {
+ player[i].aitype = attacktypecutoff;
+ player[i].lastseentime = 1;
}
- if(!player[0].dead)
- if(player[i].ally>=0){
- if(weapons[player[i].ally].owner!=-1||
- distsq(&player[i].coords,&weapons[player[i].ally].position)>16){
- player[i].aitype=attacktypecutoff;
- player[i].lastseentime=1;
+ if (!player[0].dead)
+ if (player[i].ally >= 0) {
+ if (weapons[player[i].ally].owner != -1 ||
+ distsq(&player[i].coords, &weapons[player[i].ally].position) > 16) {
+ player[i].aitype = attacktypecutoff;
+ player[i].lastseentime = 1;
}
//TODO: factor these out as moveToward()
- player[i].targetyaw=roughDirectionTo(player[i].coords,weapons[player[i].ally].position);
- player[i].lookyaw=player[i].targetyaw;
- player[i].aiupdatedelay=.05;
- player[i].forwardkeydown=1;
-
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
- if(!player[i].avoidsomething)
- player[i].targetyaw+=90*(player[i].whichdirection*2-1);
- else{
- XYZ leftpos,rightpos;
- float leftdist,rightdist;
- leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
- rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
+ player[i].targetyaw = roughDirectionTo(player[i].coords, weapons[player[i].ally].position);
+ player[i].lookyaw = player[i].targetyaw;
+ player[i].aiupdatedelay = .05;
+ player[i].forwardkeydown = 1;
+
+
+ if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8) {
+ if (!player[i].avoidsomething)
+ player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+ else {
+ XYZ leftpos, rightpos;
+ float leftdist, rightdist;
+ leftpos = player[i].coords + DoRotation(player[i].facing, 0, 90, 0);
+ rightpos = player[i].coords - DoRotation(player[i].facing, 0, 90, 0);
leftdist = distsq(&leftpos, &player[i].avoidwhere);
rightdist = distsq(&rightpos, &player[i].avoidwhere);
- if(leftdist<rightdist)
- player[i].targetyaw+=90;
+ if (leftdist < rightdist)
+ player[i].targetyaw += 90;
else
- player[i].targetyaw-=90;
+ player[i].targetyaw -= 90;
}
}
}
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].attackkeydown=0;
- player[i].throwkeydown=1;
- player[i].crouchkeydown=0;
- if(player[i].animTarget!=crouchremoveknifeanim&&
- player[i].animTarget!=removeknifeanim)
- player[i].throwtogglekeydown=0;
- player[i].drawkeydown=0;
- }
- if(player[i].collided<1||player[i].animTarget!=jumpupanim)
- player[i].jumpkeydown=0;
- if((player[i].collided>.8&&player[i].jumppower>=5))
- player[i].jumpkeydown=1;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].attackkeydown = 0;
+ player[i].throwkeydown = 1;
+ player[i].crouchkeydown = 0;
+ if (player[i].animTarget != crouchremoveknifeanim &&
+ player[i].animTarget != removeknifeanim)
+ player[i].throwtogglekeydown = 0;
+ player[i].drawkeydown = 0;
+ }
+ if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+ player[i].jumpkeydown = 0;
+ if ((player[i].collided > .8 && player[i].jumppower >= 5))
+ player[i].jumpkeydown = 1;
}
- if(player[i].aitype==attacktypecutoff){
- player[i].aiupdatedelay-=multiplier;
+ if (player[i].aitype == attacktypecutoff) {
+ player[i].aiupdatedelay -= multiplier;
//dodge or reverse rabbit kicks, knife throws, flips
- if(player[i].damage<player[i].damagetolerance*2/3)
- if((player[0].animTarget==rabbitkickanim||
- player[0].animTarget==knifethrowanim||
- (player[0].isFlip()&&
- normaldotproduct(player[0].facing,player[0].coords-player[i].coords)<0))&&
- !player[0].skeleton.free&&
- (player[i].aiupdatedelay<.1)){
- player[i].attackkeydown=0;
- if(player[i].isIdle())
- player[i].crouchkeydown=1;
- if(player[0].animTarget!=rabbitkickanim&&player[0].weaponactive!=-1){
- if(weapons[player[0].weaponids[0]].getType()==knife){
- if(player[i].isIdle()||player[i].isCrouch()||player[i].isRun()||player[i].isFlip()){
- if(abs(Random()%2==0))
+ if (player[i].damage < player[i].damagetolerance * 2 / 3)
+ if ((player[0].animTarget == rabbitkickanim ||
+ player[0].animTarget == knifethrowanim ||
+ (player[0].isFlip() &&
+ normaldotproduct(player[0].facing, player[0].coords - player[i].coords) < 0)) &&
+ !player[0].skeleton.free &&
+ (player[i].aiupdatedelay < .1)) {
+ player[i].attackkeydown = 0;
+ if (player[i].isIdle())
+ player[i].crouchkeydown = 1;
+ if (player[0].animTarget != rabbitkickanim && player[0].weaponactive != -1) {
+ if (weapons[player[0].weaponids[0]].getType() == knife) {
+ if (player[i].isIdle() || player[i].isCrouch() || player[i].isRun() || player[i].isFlip()) {
+ if (abs(Random() % 2 == 0))
player[i].setAnimation(backhandspringanim);
else
player[i].setAnimation(rollanim);
- player[i].targetyaw+=90*(abs(Random()%2)*2-1);
- player[i].wentforweapon=0;
+ player[i].targetyaw += 90 * (abs(Random() % 2) * 2 - 1);
+ player[i].wentforweapon = 0;
}
- if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim)
+ if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim)
player[i].setAnimation(flipanim);
}
}
- player[i].forwardkeydown=0;
- player[i].aiupdatedelay=.02;
+ player[i].forwardkeydown = 0;
+ player[i].aiupdatedelay = .02;
}
//get confused by flips
- if(player[0].isFlip()&&
- !player[0].skeleton.free&&
- player[0].animTarget!=walljumprightkickanim&&
- player[0].animTarget!=walljumpleftkickanim){
- if(distsq(&player[0].coords,&player[i].coords)<25)
- if((1-player[i].damage/player[i].damagetolerance)>.5)
- player[i].stunned=1;
+ if (player[0].isFlip() &&
+ !player[0].skeleton.free &&
+ player[0].animTarget != walljumprightkickanim &&
+ player[0].animTarget != walljumpleftkickanim) {
+ if (distsq(&player[0].coords, &player[i].coords) < 25)
+ if ((1 - player[i].damage / player[i].damagetolerance) > .5)
+ player[i].stunned = 1;
}
//go for weapon on the ground
- if(player[i].wentforweapon<3)
- for(int k=0;k<weapons.size();k++)
- if(player[i].creature!=wolftype)
- if(player[i].num_weapons==0&&
- weapons[k].owner==-1&&
- weapons[i].velocity.x==0&&
- weapons[i].velocity.z==0&&
- weapons[i].velocity.y==0){
- if(distsq(&player[i].coords,&weapons[k].position)<16) {
+ if (player[i].wentforweapon < 3)
+ for (int k = 0; k < weapons.size(); k++)
+ if (player[i].creature != wolftype)
+ if (player[i].num_weapons == 0 &&
+ weapons[k].owner == -1 &&
+ weapons[i].velocity.x == 0 &&
+ weapons[i].velocity.z == 0 &&
+ weapons[i].velocity.y == 0) {
+ if (distsq(&player[i].coords, &weapons[k].position) < 16) {
player[i].wentforweapon++;
- player[i].lastchecktime=6;
- player[i].aitype=getweapontype;
- player[i].ally=-1;
+ player[i].lastchecktime = 6;
+ player[i].aitype = getweapontype;
+ player[i].ally = -1;
}
}
//dodge/reverse walljump kicks
- if(player[i].damage<player[i].damagetolerance/2)
- if(animation[player[i].animTarget].height!=highheight)
- if(player[i].damage<player[i].damagetolerance*.5&&
- ((player[0].animTarget==walljumprightkickanim||
- player[0].animTarget==walljumpleftkickanim)&&
- ((player[i].aiupdatedelay<.15&&
- difficulty==2)||
- (player[i].aiupdatedelay<.08&&
- difficulty!=2)))){
- player[i].crouchkeydown=1;
+ if (player[i].damage < player[i].damagetolerance / 2)
+ if (animation[player[i].animTarget].height != highheight)
+ if (player[i].damage < player[i].damagetolerance * .5 &&
+ ((player[0].animTarget == walljumprightkickanim ||
+ player[0].animTarget == walljumpleftkickanim) &&
+ ((player[i].aiupdatedelay < .15 &&
+ difficulty == 2) ||
+ (player[i].aiupdatedelay < .08 &&
+ difficulty != 2)))) {
+ player[i].crouchkeydown = 1;
}
//walked off a ledge (?)
- if(player[i].isRun()&&!player[i].onground)
- if(player[i].coords.y>terrain.getHeight(player[i].coords.x,player[i].coords.z)+10){
- XYZ test2=player[i].coords+player[i].facing;
- test2.y+=5;
- XYZ test=player[i].coords+player[i].facing;
- test.y-=10;
- j=checkcollide(test2,test,player[i].laststanding);
- if(j==-1)
- j=checkcollide(test2,test);
- if(j==-1) {
- player[i].velocity=0;
+ if (player[i].isRun() && !player[i].onground)
+ if (player[i].coords.y > terrain.getHeight(player[i].coords.x, player[i].coords.z) + 10) {
+ XYZ test2 = player[i].coords + player[i].facing;
+ test2.y += 5;
+ XYZ test = player[i].coords + player[i].facing;
+ test.y -= 10;
+ j = checkcollide(test2, test, player[i].laststanding);
+ if (j == -1)
+ j = checkcollide(test2, test);
+ if (j == -1) {
+ player[i].velocity = 0;
player[i].setAnimation(player[i].getStop());
- player[i].targetyaw+=180;
- player[i].stunned=.5;
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
+ player[i].targetyaw += 180;
+ player[i].stunned = .5;
+ player[i].aitype = pathfindtype;
+ player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+ player[i].finalpathfindpoint = -1;
+ player[i].targetpathfindpoint = -1;
+ player[i].lastpathfindpoint = -1;
+ player[i].lastpathfindpoint2 = -1;
+ player[i].lastpathfindpoint3 = -1;
+ player[i].lastpathfindpoint4 = -1;
} else
- player[i].laststanding=j;
+ player[i].laststanding = j;
}
//lose sight of player in the air (?)
- if(player[0].coords.y>player[i].coords.y+5&&
- animation[player[0].animTarget].height!=highheight&&
- !player[0].onterrain){
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
+ if (player[0].coords.y > player[i].coords.y + 5 &&
+ animation[player[0].animTarget].height != highheight &&
+ !player[0].onterrain) {
+ player[i].aitype = pathfindtype;
+ player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+ player[i].finalpathfindpoint = -1;
+ player[i].targetpathfindpoint = -1;
+ player[i].lastpathfindpoint = -1;
+ player[i].lastpathfindpoint2 = -1;
+ player[i].lastpathfindpoint3 = -1;
+ player[i].lastpathfindpoint4 = -1;
}
//it's time to think (?)
- if(player[i].aiupdatedelay<0&&
- !animation[player[i].animTarget].attack&&
- player[i].animTarget!=staggerbackhighanim&&
- player[i].animTarget!=staggerbackhardanim&&
- player[i].animTarget!=backhandspringanim&&
- player[i].animTarget!=dodgebackanim){
+ if (player[i].aiupdatedelay < 0 &&
+ !animation[player[i].animTarget].attack &&
+ player[i].animTarget != staggerbackhighanim &&
+ player[i].animTarget != staggerbackhardanim &&
+ player[i].animTarget != backhandspringanim &&
+ player[i].animTarget != dodgebackanim) {
//draw weapon
- if(player[i].weaponactive==-1&&player[i].num_weapons>0)
- player[i].drawkeydown=Random()%2;
+ if (player[i].weaponactive == -1 && player[i].num_weapons > 0)
+ player[i].drawkeydown = Random() % 2;
else
- player[i].drawkeydown=0;
- player[i].rabbitkickenabled=Random()%2;
+ player[i].drawkeydown = 0;
+ player[i].rabbitkickenabled = Random() % 2;
//chase player
- XYZ rotatetarget=player[0].coords+player[0].velocity;
- XYZ targetpoint=player[0].coords;
- if(distsq(&player[0].coords,&player[i].coords)<
- distsq(&rotatetarget,&player[i].coords))
- targetpoint+=player[0].velocity*
- findDistance(&player[0].coords,&player[i].coords)/findLength(&player[i].velocity);
- player[i].targetyaw=roughDirectionTo(player[i].coords,targetpoint);
- player[i].lookyaw=player[i].targetyaw;
- player[i].aiupdatedelay=.2+fabs((float)(Random()%100)/1000);
-
- if(distsq(&player[i].coords,&player[0].coords)>5&&(player[0].weaponactive==-1||player[i].weaponactive!=-1))
- player[i].forwardkeydown=1;
- else if((distsq(&player[i].coords,&player[0].coords)>16||
- distsq(&player[i].coords,&player[0].coords)<9)&&
- player[0].weaponactive!=-1)
- player[i].forwardkeydown=1;
- else if(Random()%6==0||(player[i].creature==wolftype&&Random()%3==0))
- player[i].forwardkeydown=1;
+ XYZ rotatetarget = player[0].coords + player[0].velocity;
+ XYZ targetpoint = player[0].coords;
+ if (distsq(&player[0].coords, &player[i].coords) <
+ distsq(&rotatetarget, &player[i].coords))
+ targetpoint += player[0].velocity *
+ findDistance(&player[0].coords, &player[i].coords) / findLength(&player[i].velocity);
+ player[i].targetyaw = roughDirectionTo(player[i].coords, targetpoint);
+ player[i].lookyaw = player[i].targetyaw;
+ player[i].aiupdatedelay = .2 + fabs((float)(Random() % 100) / 1000);
+
+ if (distsq(&player[i].coords, &player[0].coords) > 5 && (player[0].weaponactive == -1 || player[i].weaponactive != -1))
+ player[i].forwardkeydown = 1;
+ else if ((distsq(&player[i].coords, &player[0].coords) > 16 ||
+ distsq(&player[i].coords, &player[0].coords) < 9) &&
+ player[0].weaponactive != -1)
+ player[i].forwardkeydown = 1;
+ else if (Random() % 6 == 0 || (player[i].creature == wolftype && Random() % 3 == 0))
+ player[i].forwardkeydown = 1;
else
- player[i].forwardkeydown=0;
+ player[i].forwardkeydown = 0;
//chill out around the corpse
- if(player[0].dead){
- player[i].forwardkeydown=0;
- if(Random()%10==0)
- player[i].forwardkeydown=1;
- if(Random()%100==0){
- player[i].aitype=pathfindtype;
- player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
- player[i].finalpathfindpoint=-1;
- player[i].targetpathfindpoint=-1;
- player[i].lastpathfindpoint=-1;
- player[i].lastpathfindpoint2=-1;
- player[i].lastpathfindpoint3=-1;
- player[i].lastpathfindpoint4=-1;
+ if (player[0].dead) {
+ player[i].forwardkeydown = 0;
+ if (Random() % 10 == 0)
+ player[i].forwardkeydown = 1;
+ if (Random() % 100 == 0) {
+ player[i].aitype = pathfindtype;
+ player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+ player[i].finalpathfindpoint = -1;
+ player[i].targetpathfindpoint = -1;
+ player[i].lastpathfindpoint = -1;
+ player[i].lastpathfindpoint2 = -1;
+ player[i].lastpathfindpoint3 = -1;
+ player[i].lastpathfindpoint4 = -1;
}
}
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].crouchkeydown=0;
- player[i].throwkeydown=0;
-
- if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8)
- player[i].targetyaw+=90*(player[i].whichdirection*2-1);
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].throwkeydown = 0;
+
+ if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8)
+ player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
//attack!!!
- if(Random()%2==0||player[i].weaponactive!=-1||player[i].creature==wolftype)
- player[i].attackkeydown=1;
+ if (Random() % 2 == 0 || player[i].weaponactive != -1 || player[i].creature == wolftype)
+ player[i].attackkeydown = 1;
else
- player[i].attackkeydown=0;
- if(player[i].isRun()&&Random()%6&&distsq(&player[i].coords,&player[0].coords)>7)
- player[i].attackkeydown=0;
+ player[i].attackkeydown = 0;
+ if (player[i].isRun() && Random() % 6 && distsq(&player[i].coords, &player[0].coords) > 7)
+ player[i].attackkeydown = 0;
//TODO: wat
- if(player[i].aitype!=playercontrolled&&
- (player[i].isIdle()||
- player[i].isCrouch()||
- player[i].isRun())){
- int target=-2;
- for(int j=0;j<numplayers;j++)
- if(j!=i&&!player[j].skeleton.free&&
- player[j].hasvictim&&
- (tutoriallevel==1&&reversaltrain||
- Random()%2==0&&difficulty==2||
- Random()%4==0&&difficulty==1||
- Random()%8==0&&difficulty==0||
- player[j].lastattack2==player[j].animTarget&&
- player[j].lastattack3==player[j].animTarget&&
- (Random()%2==0||difficulty==2)||
- (player[i].isIdle()||player[i].isRun())&&
- player[j].weaponactive!=-1||
- player[j].animTarget==swordslashanim&&
- player[i].weaponactive!=-1||
- player[j].animTarget==staffhitanim||
- player[j].animTarget==staffspinhitanim))
- if(distsq(&player[j].coords,&player[j].victim->coords)<4&&
- player[j].victim==&player[i]&&
- (player[j].animTarget==sweepanim||
- player[j].animTarget==spinkickanim||
- player[j].animTarget==staffhitanim||
- player[j].animTarget==staffspinhitanim||
- player[j].animTarget==winduppunchanim||
- player[j].animTarget==upunchanim||
- player[j].animTarget==wolfslapanim||
- player[j].animTarget==knifeslashstartanim||
- player[j].animTarget==swordslashanim&&
- (distsq(&player[j].coords,&player[i].coords)<2||
- player[i].weaponactive!=-1))){
- if(target>=0)
- target=-1;
+ if (player[i].aitype != playercontrolled &&
+ (player[i].isIdle() ||
+ player[i].isCrouch() ||
+ player[i].isRun())) {
+ int target = -2;
+ for (int j = 0; j < numplayers; j++)
+ if (j != i && !player[j].skeleton.free &&
+ player[j].hasvictim &&
+ (tutoriallevel == 1 && reversaltrain ||
+ Random() % 2 == 0 && difficulty == 2 ||
+ Random() % 4 == 0 && difficulty == 1 ||
+ Random() % 8 == 0 && difficulty == 0 ||
+ player[j].lastattack2 == player[j].animTarget &&
+ player[j].lastattack3 == player[j].animTarget &&
+ (Random() % 2 == 0 || difficulty == 2) ||
+ (player[i].isIdle() || player[i].isRun()) &&
+ player[j].weaponactive != -1 ||
+ player[j].animTarget == swordslashanim &&
+ player[i].weaponactive != -1 ||
+ player[j].animTarget == staffhitanim ||
+ player[j].animTarget == staffspinhitanim))
+ if (distsq(&player[j].coords, &player[j].victim->coords) < 4 &&
+ player[j].victim == &player[i] &&
+ (player[j].animTarget == sweepanim ||
+ player[j].animTarget == spinkickanim ||
+ player[j].animTarget == staffhitanim ||
+ player[j].animTarget == staffspinhitanim ||
+ player[j].animTarget == winduppunchanim ||
+ player[j].animTarget == upunchanim ||
+ player[j].animTarget == wolfslapanim ||
+ player[j].animTarget == knifeslashstartanim ||
+ player[j].animTarget == swordslashanim &&
+ (distsq(&player[j].coords, &player[i].coords) < 2 ||
+ player[i].weaponactive != -1))) {
+ if (target >= 0)
+ target = -1;
else
- target=j;
+ target = j;
}
- if(target>=0)
+ if (target >= 0)
player[target].Reverse();
}
- if(player[i].collided<1)
- player[i].jumpkeydown=0;
- if(player[i].collided>.8&&player[i].jumppower>=5||
- distsq(&player[i].coords,&player[0].coords)>400&&
- player[i].onterrain&&
- player[i].creature==rabbittype)
- player[i].jumpkeydown=1;
+ if (player[i].collided < 1)
+ player[i].jumpkeydown = 0;
+ if (player[i].collided > .8 && player[i].jumppower >= 5 ||
+ distsq(&player[i].coords, &player[0].coords) > 400 &&
+ player[i].onterrain &&
+ player[i].creature == rabbittype)
+ player[i].jumpkeydown = 1;
//TODO: why are we controlling the human?
- if(normaldotproduct(player[i].facing,player[0].coords-player[i].coords)>0)
- player[0].jumpkeydown=0;
- if(player[0].animTarget==jumpdownanim&&
- distsq(&player[0].coords,&player[i].coords)<40)
- player[i].crouchkeydown=1;
- if(player[i].jumpkeydown)
- player[i].attackkeydown=0;
-
- if(tutoriallevel==1)
- if(!canattack)
- player[i].attackkeydown=0;
-
-
- XYZ facing=player[i].coords;
- XYZ flatfacing=player[0].coords;
- facing.y+=player[i].jointPos(head).y*player[i].scale;
- flatfacing.y+=player[0].jointPos(head).y*player[0].scale;
- if(player[i].occluded>=2)
- if(-1!=checkcollide(facing,flatfacing)){
- if(!player[i].pause)
- player[i].lastseentime-=.2;
- if(player[i].lastseentime<=0&&
- (player[i].creature!=wolftype||
- player[i].weaponstuck==-1)){
- player[i].aitype=searchtype;
- player[i].lastchecktime=12;
- player[i].lastseen=player[0].coords;
- player[i].lastseentime=12;
+ if (normaldotproduct(player[i].facing, player[0].coords - player[i].coords) > 0)
+ player[0].jumpkeydown = 0;
+ if (player[0].animTarget == jumpdownanim &&
+ distsq(&player[0].coords, &player[i].coords) < 40)
+ player[i].crouchkeydown = 1;
+ if (player[i].jumpkeydown)
+ player[i].attackkeydown = 0;
+
+ if (tutoriallevel == 1)
+ if (!canattack)
+ player[i].attackkeydown = 0;
+
+
+ XYZ facing = player[i].coords;
+ XYZ flatfacing = player[0].coords;
+ facing.y += player[i].jointPos(head).y * player[i].scale;
+ flatfacing.y += player[0].jointPos(head).y * player[0].scale;
+ if (player[i].occluded >= 2)
+ if (-1 != checkcollide(facing, flatfacing)) {
+ if (!player[i].pause)
+ player[i].lastseentime -= .2;
+ if (player[i].lastseentime <= 0 &&
+ (player[i].creature != wolftype ||
+ player[i].weaponstuck == -1)) {
+ player[i].aitype = searchtype;
+ player[i].lastchecktime = 12;
+ player[i].lastseen = player[0].coords;
+ player[i].lastseentime = 12;
}
- }else
- player[i].lastseentime=1;
+ } else
+ player[i].lastseentime = 1;
}
}
- if(animation[player[0].animTarget].height==highheight&&
- (player[i].aitype==attacktypecutoff||
- player[i].aitype==searchtype))
- if(player[0].coords.y>terrain.getHeight(player[0].coords.x,player[0].coords.z)+10){
- XYZ test=player[0].coords;
- test.y-=40;
- if(-1==checkcollide(player[0].coords,test))
- player[i].stunned=1;
+ if (animation[player[0].animTarget].height == highheight &&
+ (player[i].aitype == attacktypecutoff ||
+ player[i].aitype == searchtype))
+ if (player[0].coords.y > terrain.getHeight(player[0].coords.x, player[0].coords.z) + 10) {
+ XYZ test = player[0].coords;
+ test.y -= 40;
+ if (-1 == checkcollide(player[0].coords, test))
+ player[i].stunned = 1;
}
//stunned
- if(player[i].aitype==passivetype&&!(player[i].numwaypoints>1)||
- player[i].stunned>0||
- player[i].pause&&player[i].damage>player[i].superpermanentdamage){
- if(player[i].pause)
- player[i].lastseentime=1;
- player[i].targetyaw=player[i].yaw;
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].attackkeydown=0;
- player[i].crouchkeydown=0;
- player[i].throwkeydown=0;
+ if (player[i].aitype == passivetype && !(player[i].numwaypoints > 1) ||
+ player[i].stunned > 0 ||
+ player[i].pause && player[i].damage > player[i].superpermanentdamage) {
+ if (player[i].pause)
+ player[i].lastseentime = 1;
+ player[i].targetyaw = player[i].yaw;
+ player[i].forwardkeydown = 0;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].jumpkeydown = 0;
+ player[i].attackkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].throwkeydown = 0;
}
XYZ facing;
- facing=0;
- facing.z=-1;
-
- XYZ flatfacing=DoRotation(facing,0,player[i].yaw+180,0);
- facing=flatfacing;
-
- if(player[i].aitype==attacktypecutoff){
- player[i].targetheadyaw=180-roughDirectionTo(player[i].coords,player[0].coords);
- player[i].targetheadpitch=pitchTo(player[i].coords,player[0].coords);
- }else if(player[i].howactive>=typesleeping){
- player[i].targetheadyaw=player[i].targetyaw;
- player[i].targetheadpitch=0;
- }else{
- if(player[i].interestdelay<=0){
- player[i].interestdelay=.7+(float)(abs(Random()%100))/100;
- player[i].headtarget=player[i].coords;
- player[i].headtarget.x+=(float)(abs(Random()%200)-100)/100;
- player[i].headtarget.z+=(float)(abs(Random()%200)-100)/100;
- player[i].headtarget.y+=(float)(abs(Random()%200)-100)/300;
- player[i].headtarget+=player[i].facing*1.5;
- }
- player[i].targetheadyaw=180-roughDirectionTo(player[i].coords,player[i].headtarget);
- player[i].targetheadpitch=pitchTo(player[i].coords,player[i].headtarget);
+ facing = 0;
+ facing.z = -1;
+
+ XYZ flatfacing = DoRotation(facing, 0, player[i].yaw + 180, 0);
+ facing = flatfacing;
+
+ if (player[i].aitype == attacktypecutoff) {
+ player[i].targetheadyaw = 180 - roughDirectionTo(player[i].coords, player[0].coords);
+ player[i].targetheadpitch = pitchTo(player[i].coords, player[0].coords);
+ } else if (player[i].howactive >= typesleeping) {
+ player[i].targetheadyaw = player[i].targetyaw;
+ player[i].targetheadpitch = 0;
+ } else {
+ if (player[i].interestdelay <= 0) {
+ player[i].interestdelay = .7 + (float)(abs(Random() % 100)) / 100;
+ player[i].headtarget = player[i].coords;
+ player[i].headtarget.x += (float)(abs(Random() % 200) - 100) / 100;
+ player[i].headtarget.z += (float)(abs(Random() % 200) - 100) / 100;
+ player[i].headtarget.y += (float)(abs(Random() % 200) - 100) / 300;
+ player[i].headtarget += player[i].facing * 1.5;
+ }
+ player[i].targetheadyaw = 180 - roughDirectionTo(player[i].coords, player[i].headtarget);
+ player[i].targetheadpitch = pitchTo(player[i].coords, player[i].headtarget);
}
}
}
-void updateSettingsMenu(){
+void updateSettingsMenu()
+{
char sbuf[256];
- if((float)newscreenwidth>(float)newscreenheight*1.61||(float)newscreenwidth<(float)newscreenheight*1.59)
- sprintf (sbuf, "Resolution: %d*%d",(int)newscreenwidth,(int)newscreenheight);
+ if ((float)newscreenwidth > (float)newscreenheight * 1.61 || (float)newscreenwidth < (float)newscreenheight * 1.59)
+ sprintf (sbuf, "Resolution: %d*%d", (int)newscreenwidth, (int)newscreenheight);
else
- sprintf (sbuf, "Resolution: %d*%d (widescreen)",(int)newscreenwidth,(int)newscreenheight);
- Menu::setText(0,sbuf);
- if(newdetail==0) Menu::setText(1,"Detail: Low");
- if(newdetail==1) Menu::setText(1,"Detail: Medium");
- if(newdetail==2) Menu::setText(1,"Detail: High");
- if(bloodtoggle==0) Menu::setText(2,"Blood: Off");
- if(bloodtoggle==1) Menu::setText(2,"Blood: On, low detail");
- if(bloodtoggle==2) Menu::setText(2,"Blood: On, high detail (slower)");
- if(difficulty==0) Menu::setText(3,"Difficulty: Easier");
- if(difficulty==1) Menu::setText(3,"Difficulty: Difficult");
- if(difficulty==2) Menu::setText(3,"Difficulty: Insane");
- Menu::setText(4,ismotionblur?"Blur Effects: Enabled (less compatible)":"Blur Effects: Disabled (more compatible)");
- Menu::setText(5,decals?"Decals: Enabled (slower)":"Decals: Disabled");
- Menu::setText(6,musictoggle?"Music: Enabled":"Music: Disabled");
- Menu::setText(9,invertmouse?"Invert mouse: Yes":"Invert mouse: No");
- sprintf (sbuf, "Mouse Speed: %d", (int)(usermousesensitivity*5));
- Menu::setText(10,sbuf);
- sprintf (sbuf, "Volume: %d%%", (int)(volume*100));
- Menu::setText(11,sbuf);
- Menu::setText(13,showdamagebar?"Damage Bar: On":"Damage Bar: Off");
- if(newdetail==detail&&newscreenheight==(int)screenheight&&newscreenwidth==(int)screenwidth)
+ sprintf (sbuf, "Resolution: %d*%d (widescreen)", (int)newscreenwidth, (int)newscreenheight);
+ Menu::setText(0, sbuf);
+ if (newdetail == 0) Menu::setText(1, "Detail: Low");
+ if (newdetail == 1) Menu::setText(1, "Detail: Medium");
+ if (newdetail == 2) Menu::setText(1, "Detail: High");
+ if (bloodtoggle == 0) Menu::setText(2, "Blood: Off");
+ if (bloodtoggle == 1) Menu::setText(2, "Blood: On, low detail");
+ if (bloodtoggle == 2) Menu::setText(2, "Blood: On, high detail (slower)");
+ if (difficulty == 0) Menu::setText(3, "Difficulty: Easier");
+ if (difficulty == 1) Menu::setText(3, "Difficulty: Difficult");
+ if (difficulty == 2) Menu::setText(3, "Difficulty: Insane");
+ Menu::setText(4, ismotionblur ? "Blur Effects: Enabled (less compatible)" : "Blur Effects: Disabled (more compatible)");
+ Menu::setText(5, decals ? "Decals: Enabled (slower)" : "Decals: Disabled");
+ Menu::setText(6, musictoggle ? "Music: Enabled" : "Music: Disabled");
+ Menu::setText(9, invertmouse ? "Invert mouse: Yes" : "Invert mouse: No");
+ sprintf (sbuf, "Mouse Speed: %d", (int)(usermousesensitivity * 5));
+ Menu::setText(10, sbuf);
+ sprintf (sbuf, "Volume: %d%%", (int)(volume * 100));
+ Menu::setText(11, sbuf);
+ Menu::setText(13, showdamagebar ? "Damage Bar: On" : "Damage Bar: Off");
+ if (newdetail == detail && newscreenheight == (int)screenheight && newscreenwidth == (int)screenwidth)
sprintf (sbuf, "Back");
else
sprintf (sbuf, "Back (some changes take effect next time Lugaru is opened)");
- Menu::setText(8,sbuf);
+ Menu::setText(8, sbuf);
}
-void updateStereoConfigMenu(){
+void updateStereoConfigMenu()
+{
char sbuf[256];
sprintf(sbuf, "Stereo mode: %s", StereoModeName(newstereomode));
- Menu::setText(0,sbuf);
+ Menu::setText(0, sbuf);
sprintf(sbuf, "Stereo separation: %.3f", stereoseparation);
- Menu::setText(1,sbuf);
+ Menu::setText(1, sbuf);
sprintf(sbuf, "Reverse stereo: %s", stereoreverse ? "Yes" : "No");
- Menu::setText(2,sbuf);
+ Menu::setText(2, sbuf);
}
-void updateControlsMenu(){
- Menu::setText(0,(string)"Forwards: "+(keyselect==0?"_":Input::keyToChar(forwardkey)));
- Menu::setText(1,(string)"Back: " +(keyselect==1?"_":Input::keyToChar(backkey)));
- Menu::setText(2,(string)"Left: " +(keyselect==2?"_":Input::keyToChar(leftkey)));
- Menu::setText(3,(string)"Right: " +(keyselect==3?"_":Input::keyToChar(rightkey)));
- Menu::setText(4,(string)"Crouch: " +(keyselect==4?"_":Input::keyToChar(crouchkey)));
- Menu::setText(5,(string)"Jump: " +(keyselect==5?"_":Input::keyToChar(jumpkey)));
- Menu::setText(6,(string)"Draw: " +(keyselect==6?"_":Input::keyToChar(drawkey)));
- Menu::setText(7,(string)"Throw: " +(keyselect==7?"_":Input::keyToChar(throwkey)));
- Menu::setText(8,(string)"Attack: " +(keyselect==8?"_":Input::keyToChar(attackkey)));
- if(debugmode)
- Menu::setText(9,(string)"Console: "+(keyselect==9?"_":Input::keyToChar(consolekey)));
+void updateControlsMenu()
+{
+ Menu::setText(0, (string)"Forwards: " + (keyselect == 0 ? "_" : Input::keyToChar(forwardkey)));
+ Menu::setText(1, (string)"Back: " + (keyselect == 1 ? "_" : Input::keyToChar(backkey)));
+ Menu::setText(2, (string)"Left: " + (keyselect == 2 ? "_" : Input::keyToChar(leftkey)));
+ Menu::setText(3, (string)"Right: " + (keyselect == 3 ? "_" : Input::keyToChar(rightkey)));
+ Menu::setText(4, (string)"Crouch: " + (keyselect == 4 ? "_" : Input::keyToChar(crouchkey)));
+ Menu::setText(5, (string)"Jump: " + (keyselect == 5 ? "_" : Input::keyToChar(jumpkey)));
+ Menu::setText(6, (string)"Draw: " + (keyselect == 6 ? "_" : Input::keyToChar(drawkey)));
+ Menu::setText(7, (string)"Throw: " + (keyselect == 7 ? "_" : Input::keyToChar(throwkey)));
+ Menu::setText(8, (string)"Attack: " + (keyselect == 8 ? "_" : Input::keyToChar(attackkey)));
+ if (debugmode)
+ Menu::setText(9, (string)"Console: " + (keyselect == 9 ? "_" : Input::keyToChar(consolekey)));
}
/*
18 stereo configuration
*/
-void Game::LoadMenu(){
+void Game::LoadMenu()
+{
Menu::clearMenu();
- switch(mainmenu) {
- case 1:
- case 2:
- Menu::addImage(0,Mainmenuitems[0],150,480-128,256,128);
- Menu::addButtonImage(1,Mainmenuitems[mainmenu==1?1:5],18,480-152-32,128,32);
- Menu::addButtonImage(2,Mainmenuitems[2],18,480-228-32,112,32);
- Menu::addButtonImage(3,Mainmenuitems[mainmenu==1?3:6],18,480-306-32,mainmenu==1?68:132,32);
+ switch (mainmenu) {
+ case 1:
+ case 2:
+ Menu::addImage(0, Mainmenuitems[0], 150, 480 - 128, 256, 128);
+ Menu::addButtonImage(1, Mainmenuitems[mainmenu == 1 ? 1 : 5], 18, 480 - 152 - 32, 128, 32);
+ Menu::addButtonImage(2, Mainmenuitems[2], 18, 480 - 228 - 32, 112, 32);
+ Menu::addButtonImage(3, Mainmenuitems[mainmenu == 1 ? 3 : 6], 18, 480 - 306 - 32, mainmenu == 1 ? 68 : 132, 32);
break;
- case 3:
- Menu::addButton( 0,"",10+20,440);
- Menu::addButton( 1,"",10+60,405);
- Menu::addButton( 2,"",10+70,370);
- Menu::addButton( 3,"",10+20-1000,335-1000);
- Menu::addButton( 4,"",10 ,335);
- Menu::addButton( 5,"",10+60,300);
- Menu::addButton( 6,"",10+70,265);
- Menu::addButton( 9,"",10 ,230);
- Menu::addButton(10,"",20 ,195);
- Menu::addButton(11,"",10+60,160);
- Menu::addButton(13,"",30 ,125);
- Menu::addButton( 7,"-Configure Controls-",10+15, 90);
- Menu::addButton(12,"-Configure Stereo -",10+15, 55);
- Menu::addButton(8,"Back",10,10);
- updateSettingsMenu();
+ case 3:
+ Menu::addButton( 0, "", 10 + 20, 440);
+ Menu::addButton( 1, "", 10 + 60, 405);
+ Menu::addButton( 2, "", 10 + 70, 370);
+ Menu::addButton( 3, "", 10 + 20 - 1000, 335 - 1000);
+ Menu::addButton( 4, "", 10 , 335);
+ Menu::addButton( 5, "", 10 + 60, 300);
+ Menu::addButton( 6, "", 10 + 70, 265);
+ Menu::addButton( 9, "", 10 , 230);
+ Menu::addButton(10, "", 20 , 195);
+ Menu::addButton(11, "", 10 + 60, 160);
+ Menu::addButton(13, "", 30 , 125);
+ Menu::addButton( 7, "-Configure Controls-", 10 + 15, 90);
+ Menu::addButton(12, "-Configure Stereo -", 10 + 15, 55);
+ Menu::addButton(8, "Back", 10, 10);
+ updateSettingsMenu();
break;
- case 4:
- Menu::addButton(0,"",10 ,400);
- Menu::addButton(1,"",10+40,360);
- Menu::addButton(2,"",10+40,320);
- Menu::addButton(3,"",10+30,280);
- Menu::addButton(4,"",10+20,240);
- Menu::addButton(5,"",10+40,200);
- Menu::addButton(6,"",10+40,160);
- Menu::addButton(7,"",10+30,120);
- Menu::addButton(8,"",10+20,80);
- if(debugmode)
- Menu::addButton(9,"",10+10,40);
- Menu::addButton(debugmode?10:9,"Back",10,10);
- updateControlsMenu();
+ case 4:
+ Menu::addButton(0, "", 10 , 400);
+ Menu::addButton(1, "", 10 + 40, 360);
+ Menu::addButton(2, "", 10 + 40, 320);
+ Menu::addButton(3, "", 10 + 30, 280);
+ Menu::addButton(4, "", 10 + 20, 240);
+ Menu::addButton(5, "", 10 + 40, 200);
+ Menu::addButton(6, "", 10 + 40, 160);
+ Menu::addButton(7, "", 10 + 30, 120);
+ Menu::addButton(8, "", 10 + 20, 80);
+ if (debugmode)
+ Menu::addButton(9, "", 10 + 10, 40);
+ Menu::addButton(debugmode ? 10 : 9, "Back", 10, 10);
+ updateControlsMenu();
break;
- case 5: {
- LoadCampaign();
- Menu::addLabel(-1,accountactive->getName(),5,400);
- Menu::addButton(1,"Tutorial",5,300);
- Menu::addButton(2,"Challenge",5,240);
- Menu::addButton(3,"Delete User",400,10);
- Menu::addButton(4,"Main Menu",5,10);
- Menu::addButton(5,"Change User",5,180);
- Menu::addButton(6,"Campaign : "+accountactive->getCurrentCampaign(),200,420);
-
- //show campaign map
- //with (2,-5) offset from old code
- Menu::addImage(-1,Mainmenuitems[7],150+2,60-5,400,400);
- //show levels
- int numlevels = accountactive->getCampaignChoicesMade();
- numlevels += numlevels>0 ? campaignlevels[numlevels-1].nextlevel.size() : 1;
- for(int i=0;i<numlevels;i++){
- XYZ midpoint=campaignlevels[i].getCenter();
- float itemsize=campaignlevels[i].getWidth();
- const bool active=i>=accountactive->getCampaignChoicesMade();
- if(!active)
- itemsize/=2;
-
- if(i>=1){
- XYZ start=campaignlevels[i-1].getCenter();
- Menu::addMapLine(start.x,start.y,midpoint.x-start.x,midpoint.y-start.y,0.5,active?1:0.5,active?1:0.5,0,0);
- }
- Menu::addMapMarker(NB_CAMPAIGN_MENU_ITEM+i, Mapcircletexture,
- midpoint.x-itemsize/2, midpoint.y-itemsize/2, itemsize, itemsize, active?1:0.5, 0, 0);
+ case 5: {
+ LoadCampaign();
+ Menu::addLabel(-1, accountactive->getName(), 5, 400);
+ Menu::addButton(1, "Tutorial", 5, 300);
+ Menu::addButton(2, "Challenge", 5, 240);
+ Menu::addButton(3, "Delete User", 400, 10);
+ Menu::addButton(4, "Main Menu", 5, 10);
+ Menu::addButton(5, "Change User", 5, 180);
+ Menu::addButton(6, "Campaign : " + accountactive->getCurrentCampaign(), 200, 420);
+
+ //show campaign map
+ //with (2,-5) offset from old code
+ Menu::addImage(-1, Mainmenuitems[7], 150 + 2, 60 - 5, 400, 400);
+ //show levels
+ int numlevels = accountactive->getCampaignChoicesMade();
+ numlevels += numlevels > 0 ? campaignlevels[numlevels - 1].nextlevel.size() : 1;
+ for (int i = 0; i < numlevels; i++) {
+ XYZ midpoint = campaignlevels[i].getCenter();
+ float itemsize = campaignlevels[i].getWidth();
+ const bool active = i >= accountactive->getCampaignChoicesMade();
+ if (!active)
+ itemsize /= 2;
+
+ if (i >= 1) {
+ XYZ start = campaignlevels[i - 1].getCenter();
+ Menu::addMapLine(start.x, start.y, midpoint.x - start.x, midpoint.y - start.y, 0.5, active ? 1 : 0.5, active ? 1 : 0.5, 0, 0);
+ }
+ Menu::addMapMarker(NB_CAMPAIGN_MENU_ITEM + i, Mapcircletexture,
+ midpoint.x - itemsize / 2, midpoint.y - itemsize / 2, itemsize, itemsize, active ? 1 : 0.5, 0, 0);
- if(active){
- Menu::addMapLabel(-2,campaignlevels[i].description,
- campaignlevels[i].getStartX()+10,
- campaignlevels[i].getStartY()-4);
- }
+ if (active) {
+ Menu::addMapLabel(-2, campaignlevels[i].description,
+ campaignlevels[i].getStartX() + 10,
+ campaignlevels[i].getStartY() - 4);
}
- } break;
- case 6:
- Menu::addLabel(-1,"Are you sure you want to delete this user?",10,400);
- Menu::addButton(1,"Yes",10,360);
- Menu::addButton(2,"No",10,320);
- break;
- case 7:
- if(Account::getNbAccounts()<8)
- Menu::addButton(0,"New User",10,400);
- else
- Menu::addLabel(0,"No More Users",10,400);
- Menu::addLabel(-2,"",20,400);
- Menu::addButton(Account::getNbAccounts()+1,"Back",10,10);
- for(int i=0;i<Account::getNbAccounts();i++)
- Menu::addButton(i+1,Account::get(i)->getName(),10,340-20*(i+1));
- break;
- case 8:
- Menu::addButton(0,"Easier",10,400);
- Menu::addButton(1,"Difficult",10,360);
- Menu::addButton(2,"Insane",10,320);
- break;
- case 9:
- for(int i=0;i<numchallengelevels;i++){
- char temp[255];
- string name="";
- sprintf (temp, "Level %d",i+1);
- for(int j=strlen(temp);j<17;j++)
- strcat(temp," ");
- name+=temp;
- sprintf (temp, "%d",(int)accountactive->getHighScore(i));
- for(int j=strlen(temp);j<(32-17);j++)
- strcat(temp," ");
- name+=temp;
- sprintf (temp, "%d:",(int)(((int)accountactive->getFastTime(i)-(int)(accountactive->getFastTime(i))%60)/60));
- if((int)(accountactive->getFastTime(i))%60<10)strcat(temp,"0");
- name+=temp;
- sprintf (temp, "%d",(int)(accountactive->getFastTime(i))%60);
- name+=temp;
-
- Menu::addButton(i,name,10,400-i*25,i>accountactive->getProgress()?0.5:1,0,0);
- }
-
- Menu::addButton(-1," High Score Best Time",10,440);
- Menu::addButton(numchallengelevels,"Back",10,10);
- break;
- case 10: {
- Menu::addLabel(0,"Congratulations!",220,330);
- Menu::addLabel(1,"You have avenged your family and",140,300);
- Menu::addLabel(2,"restored peace to the island of Lugaru.",110,270);
- Menu::addButton(3,"Back",10,10);
- char sbuf[256];
- sprintf(sbuf,"Your score: %d",(int)accountactive->getCampaignScore());
- Menu::addLabel(4,sbuf,190,200);
- sprintf(sbuf,"Highest score: %d",(int)accountactive->getCampaignHighScore());
- Menu::addLabel(5,sbuf,190,180);
- } break;
- case 18:
- Menu::addButton(0,"",70,400);
- Menu::addButton(1,"",10,360);
- Menu::addButton(2,"",40,320);
- Menu::addButton(3,"Back",10,10);
- updateStereoConfigMenu();
+ }
+ }
+ break;
+ case 6:
+ Menu::addLabel(-1, "Are you sure you want to delete this user?", 10, 400);
+ Menu::addButton(1, "Yes", 10, 360);
+ Menu::addButton(2, "No", 10, 320);
+ break;
+ case 7:
+ if (Account::getNbAccounts() < 8)
+ Menu::addButton(0, "New User", 10, 400);
+ else
+ Menu::addLabel(0, "No More Users", 10, 400);
+ Menu::addLabel(-2, "", 20, 400);
+ Menu::addButton(Account::getNbAccounts() + 1, "Back", 10, 10);
+ for (int i = 0; i < Account::getNbAccounts(); i++)
+ Menu::addButton(i + 1, Account::get(i)->getName(), 10, 340 - 20 * (i + 1));
+ break;
+ case 8:
+ Menu::addButton(0, "Easier", 10, 400);
+ Menu::addButton(1, "Difficult", 10, 360);
+ Menu::addButton(2, "Insane", 10, 320);
+ break;
+ case 9:
+ for (int i = 0; i < numchallengelevels; i++) {
+ char temp[255];
+ string name = "";
+ sprintf (temp, "Level %d", i + 1);
+ for (int j = strlen(temp); j < 17; j++)
+ strcat(temp, " ");
+ name += temp;
+ sprintf (temp, "%d", (int)accountactive->getHighScore(i));
+ for (int j = strlen(temp); j < (32 - 17); j++)
+ strcat(temp, " ");
+ name += temp;
+ sprintf (temp, "%d:", (int)(((int)accountactive->getFastTime(i) - (int)(accountactive->getFastTime(i)) % 60) / 60));
+ if ((int)(accountactive->getFastTime(i)) % 60 < 10)strcat(temp, "0");
+ name += temp;
+ sprintf (temp, "%d", (int)(accountactive->getFastTime(i)) % 60);
+ name += temp;
+
+ Menu::addButton(i, name, 10, 400 - i * 25, i > accountactive->getProgress() ? 0.5 : 1, 0, 0);
+ }
+
+ Menu::addButton(-1, " High Score Best Time", 10, 440);
+ Menu::addButton(numchallengelevels, "Back", 10, 10);
+ break;
+ case 10: {
+ Menu::addLabel(0, "Congratulations!", 220, 330);
+ Menu::addLabel(1, "You have avenged your family and", 140, 300);
+ Menu::addLabel(2, "restored peace to the island of Lugaru.", 110, 270);
+ Menu::addButton(3, "Back", 10, 10);
+ char sbuf[256];
+ sprintf(sbuf, "Your score: %d", (int)accountactive->getCampaignScore());
+ Menu::addLabel(4, sbuf, 190, 200);
+ sprintf(sbuf, "Highest score: %d", (int)accountactive->getCampaignHighScore());
+ Menu::addLabel(5, sbuf, 190, 180);
+ }
+ break;
+ case 18:
+ Menu::addButton(0, "", 70, 400);
+ Menu::addButton(1, "", 10, 360);
+ Menu::addButton(2, "", 40, 320);
+ Menu::addButton(3, "Back", 10, 10);
+ updateStereoConfigMenu();
break;
}
}
extern SDL_Rect **resolutions;
-void MenuTick(){
+void MenuTick()
+{
//menu buttons
- selected=Menu::getSelected(mousecoordh*640/screenwidth,480-mousecoordv*480/screenheight);
+ selected = Menu::getSelected(mousecoordh * 640 / screenwidth, 480 - mousecoordv * 480 / screenheight);
// some specific case where we do something even if the left mouse button is not pressed.
- if((mainmenu==5) && (endgame==2)) {
- accountactive->endGame();
- endgame=0;
- }
- if(mainmenu==10)
- endgame=2;
- if(mainmenu==18 && Input::isKeyPressed(MOUSEBUTTON2) && selected==1){
- stereoseparation-=0.001;
+ if ((mainmenu == 5) && (endgame == 2)) {
+ accountactive->endGame();
+ endgame = 0;
+ }
+ if (mainmenu == 10)
+ endgame = 2;
+ if (mainmenu == 18 && Input::isKeyPressed(MOUSEBUTTON2) && selected == 1) {
+ stereoseparation -= 0.001;
updateStereoConfigMenu();
}
- static int oldmainmenu=mainmenu;
+ static int oldmainmenu = mainmenu;
char sbuf[256];
- if(Input::MouseClicked() && (selected >= 0)) { // handling of the left mouse clic in menus
- switch(mainmenu) {
- case 1:
- case 2:
- switch(selected) {
- case 1:
- if(gameon) { //resume
- mainmenu=0;
- pause_sound(stream_menutheme);
- resume_stream(leveltheme);
- } else { //new game
- fireSound(firestartsound);
- flash();
- mainmenu=(accountactive?5:7);
- selected=-1;
- }
- break;
- case 2: //options
- fireSound();
- flash();
- mainmenu=3;
- if(newdetail>2) newdetail=detail;
- if(newdetail<0) newdetail=detail;
- if(newscreenwidth>3000) newscreenwidth=screenwidth;
- if(newscreenwidth<0) newscreenwidth=screenwidth;
- if(newscreenheight>3000) newscreenheight=screenheight;
- if(newscreenheight<0) newscreenheight=screenheight;
- break;
- case 3:
- fireSound();
- flash();
- if(gameon){ //end game
- gameon=0;
- mainmenu=1;
- } else { //quit
- tryquit=1;
- pause_sound(stream_menutheme);
- }
- break;
- }
- break;
- case 3:
- fireSound();
- bool isCustomResolution,found;
- switch(selected){
- case 0:
- isCustomResolution = true;
- found = false;
- for(int i = 0; (!found) && (resolutions[i]); i++) {
- if((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth))
- isCustomResolution = false;
-
- if((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight)) {
- i++;
- if(resolutions[i] != NULL) {
- newscreenwidth = (int) resolutions[i]->w;
- newscreenheight = (int) resolutions[i]->h;
- } else if(isCustomResolution){
- if((screenwidth == newscreenwidth) && (screenheight == newscreenheight)) {
- newscreenwidth = (int) resolutions[0]->w;
- newscreenheight = (int) resolutions[0]->h;
- } else {
- newscreenwidth = screenwidth;
- newscreenheight = screenheight;
- }
- } else {
- newscreenwidth = (int) resolutions[0]->w;
- newscreenheight = (int) resolutions[0]->h;
- }
- found = true;
- }
- }
-
- if(!found) {
- newscreenwidth = (int) resolutions[0]->w;
- newscreenheight = (int) resolutions[0]->h;
- }
- break;
- case 1:
- newdetail++;
- if(newdetail>2) newdetail=0;
- break;
- case 2:
- bloodtoggle++;
- if(bloodtoggle>2) bloodtoggle=0;
- break;
- case 3:
- difficulty++;
- if(difficulty>2) difficulty=0;
- break;
- case 4:
- ismotionblur = !ismotionblur;
- break;
- case 5:
- decals = !decals;
- break;
- case 6:
- musictoggle = !musictoggle;
- if(musictoggle) {
- emit_stream_np(stream_menutheme);
- } else {
- pause_sound(leveltheme);
- pause_sound(stream_fighttheme);
- pause_sound(stream_menutheme);
-
- for(int i=0;i<4;i++){
- oldmusicvolume[i]=0;
- musicvolume[i]=0;
- }
- }
- break;
- case 7: // controls
- flash();
- mainmenu=4;
- selected=-1;
- keyselect=-1;
- break;
- case 8:
- flash();
- SaveSettings();
- mainmenu=gameon?2:1;
- break;
- case 9:
- invertmouse = !invertmouse;
- break;
- case 10:
- usermousesensitivity+=.2;
- if(usermousesensitivity>2)
- usermousesensitivity=.2;
- break;
- case 11:
- volume+=.1f;
- if(volume>1.0001f)
- volume=0;
- OPENAL_SetSFXMasterVolume((int)(volume*255));
- break;
- case 12:
- flash();
- newstereomode = stereomode;
- mainmenu=18;
- keyselect=-1;
- break;
- case 13:
- showdamagebar = !showdamagebar;
- break;
- }
- updateSettingsMenu();
- break;
- case 4:
- if(!waiting) {
- fireSound();
- if(selected<(debugmode?10:9) && keyselect==-1)
- keyselect=selected;
- if(keyselect!=-1)
- setKeySelected();
- if(selected==(debugmode?10:9)){
- flash();
- mainmenu=3;
- }
- }
- updateControlsMenu();
- break;
- case 5:
- fireSound();
- flash();
- if((selected-NB_CAMPAIGN_MENU_ITEM >= accountactive->getCampaignChoicesMade())) {
- startbonustotal=0;
-
- loading=2;
- loadtime=0;
- targetlevel=7;
- if(firstload)
- TickOnceAfter();
- else
- LoadStuff();
- whichchoice=selected-NB_CAMPAIGN_MENU_ITEM-accountactive->getCampaignChoicesMade();
- actuallevel=(accountactive->getCampaignChoicesMade()>0?campaignlevels[accountactive->getCampaignChoicesMade()-1].nextlevel[whichchoice]:0);
- visibleloading=1;
- stillloading=1;
- Loadlevel(campaignlevels[actuallevel].mapname.c_str());
- campaign=1;
- mainmenu=0;
- gameon=1;
- pause_sound(stream_menutheme);
- }
- switch(selected){
- case 1:
- startbonustotal=0;
-
- loading=2;
- loadtime=0;
- targetlevel=-1;
- if(firstload) {
- TickOnceAfter();
- } else
- LoadStuff();
- Loadlevel(-1);
-
- mainmenu=0;
- gameon=1;
- pause_sound(stream_menutheme);
- break;
- case 2:
- mainmenu=9;
- break;
- case 3:
- mainmenu=6;
- break;
- case 4:
- mainmenu=(gameon?2:1);
- break;
- case 5:
- mainmenu=7;
- break;
- case 6:
- vector<string> campaigns = ListCampaigns();
- vector<string>::iterator c;
- if ((c = find(campaigns.begin(),campaigns.end(),accountactive->getCurrentCampaign()))==campaigns.end()) {
- if(!campaigns.empty())
- accountactive->setCurrentCampaign(campaigns.front());
- } else {
- c++;
- if(c==campaigns.end())
- c=campaigns.begin();
- accountactive->setCurrentCampaign(*c);
- }
- LoadMenu();
- break;
- }
- break;
- case 6:
- fireSound();
- if(selected==1) {
- flash();
- accountactive = Account::destroy(accountactive);
- mainmenu=7;
- } else if(selected==2) {
- flash();
- mainmenu=5;
- }
- break;
- case 7:
- fireSound();
- if(selected==0 && Account::getNbAccounts()<8){
- entername=1;
- } else if (selected < Account::getNbAccounts()+1) {
- flash();
- mainmenu=5;
- accountactive=Account::get(selected-1);
- } else if (selected == Account::getNbAccounts()+1) {
- flash();
- if(accountactive)
- mainmenu=5;
- else
- mainmenu=1;
- for(int j=0;j<255;j++){
- displaytext[0][j]=0;
- }
- displaychars[0]=0;
- displayselected=0;
- entername=0;
- }
- break;
- case 8:
- fireSound();
- flash();
- if(selected<=2)
- accountactive->setDifficulty(selected);
- mainmenu=5;
- break;
- case 9:
- if(selected<numchallengelevels && selected<=accountactive->getProgress()){
- fireSound();
- flash();
-
- startbonustotal=0;
-
- loading=2;
- loadtime=0;
- targetlevel=selected;
- if(firstload)
- TickOnceAfter();
- else
- LoadStuff();
- Loadlevel(selected);
- campaign=0;
-
- mainmenu=0;
- gameon=1;
- pause_sound(stream_menutheme);
- }
- if(selected==numchallengelevels){
- fireSound();
- flash();
- mainmenu=5;
- }
- break;
- case 10:
- if(selected==3){
- fireSound();
- flash();
- mainmenu=5;
- }
- break;
- case 18:
- if(selected==1)
- stereoseparation+=0.001;
- else {
- fireSound();
- if(selected==0){
- newstereomode = (StereoMode)(newstereomode + 1);
- while(!CanInitStereo(newstereomode)){
- printf("Failed to initialize mode %s (%i)\n", StereoModeName(newstereomode), newstereomode);
- newstereomode = (StereoMode)(newstereomode + 1);
- if(newstereomode >= stereoCount)
- newstereomode = stereoNone;
- }
- } else if(selected==2) {
- stereoreverse = !stereoreverse;
- } else if(selected==3) {
- flash();
- mainmenu=3;
-
- stereomode = newstereomode;
- InitStereo(stereomode);
- }
- }
- updateStereoConfigMenu();
- break;
- }
- }
-
- if(Input::isKeyDown(SDLK_q) && Input::isKeyDown(SDLK_LMETA)){
- tryquit=1;
- if(mainmenu==3) {
+ if (Input::MouseClicked() && (selected >= 0)) { // handling of the left mouse clic in menus
+ switch (mainmenu) {
+ case 1:
+ case 2:
+ switch (selected) {
+ case 1:
+ if (gameon) { //resume
+ mainmenu = 0;
+ pause_sound(stream_menutheme);
+ resume_stream(leveltheme);
+ } else { //new game
+ fireSound(firestartsound);
+ flash();
+ mainmenu = (accountactive ? 5 : 7);
+ selected = -1;
+ }
+ break;
+ case 2: //options
+ fireSound();
+ flash();
+ mainmenu = 3;
+ if (newdetail > 2) newdetail = detail;
+ if (newdetail < 0) newdetail = detail;
+ if (newscreenwidth > 3000) newscreenwidth = screenwidth;
+ if (newscreenwidth < 0) newscreenwidth = screenwidth;
+ if (newscreenheight > 3000) newscreenheight = screenheight;
+ if (newscreenheight < 0) newscreenheight = screenheight;
+ break;
+ case 3:
+ fireSound();
+ flash();
+ if (gameon) { //end game
+ gameon = 0;
+ mainmenu = 1;
+ } else { //quit
+ tryquit = 1;
+ pause_sound(stream_menutheme);
+ }
+ break;
+ }
+ break;
+ case 3:
+ fireSound();
+ bool isCustomResolution, found;
+ switch (selected) {
+ case 0:
+ isCustomResolution = true;
+ found = false;
+ for (int i = 0; (!found) && (resolutions[i]); i++) {
+ if ((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth))
+ isCustomResolution = false;
+
+ if ((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight)) {
+ i++;
+ if (resolutions[i] != NULL) {
+ newscreenwidth = (int) resolutions[i]->w;
+ newscreenheight = (int) resolutions[i]->h;
+ } else if (isCustomResolution) {
+ if ((screenwidth == newscreenwidth) && (screenheight == newscreenheight)) {
+ newscreenwidth = (int) resolutions[0]->w;
+ newscreenheight = (int) resolutions[0]->h;
+ } else {
+ newscreenwidth = screenwidth;
+ newscreenheight = screenheight;
+ }
+ } else {
+ newscreenwidth = (int) resolutions[0]->w;
+ newscreenheight = (int) resolutions[0]->h;
+ }
+ found = true;
+ }
+ }
+
+ if (!found) {
+ newscreenwidth = (int) resolutions[0]->w;
+ newscreenheight = (int) resolutions[0]->h;
+ }
+ break;
+ case 1:
+ newdetail++;
+ if (newdetail > 2) newdetail = 0;
+ break;
+ case 2:
+ bloodtoggle++;
+ if (bloodtoggle > 2) bloodtoggle = 0;
+ break;
+ case 3:
+ difficulty++;
+ if (difficulty > 2) difficulty = 0;
+ break;
+ case 4:
+ ismotionblur = !ismotionblur;
+ break;
+ case 5:
+ decals = !decals;
+ break;
+ case 6:
+ musictoggle = !musictoggle;
+ if (musictoggle) {
+ emit_stream_np(stream_menutheme);
+ } else {
+ pause_sound(leveltheme);
+ pause_sound(stream_fighttheme);
+ pause_sound(stream_menutheme);
+
+ for (int i = 0; i < 4; i++) {
+ oldmusicvolume[i] = 0;
+ musicvolume[i] = 0;
+ }
+ }
+ break;
+ case 7: // controls
+ flash();
+ mainmenu = 4;
+ selected = -1;
+ keyselect = -1;
+ break;
+ case 8:
+ flash();
+ SaveSettings();
+ mainmenu = gameon ? 2 : 1;
+ break;
+ case 9:
+ invertmouse = !invertmouse;
+ break;
+ case 10:
+ usermousesensitivity += .2;
+ if (usermousesensitivity > 2)
+ usermousesensitivity = .2;
+ break;
+ case 11:
+ volume += .1f;
+ if (volume > 1.0001f)
+ volume = 0;
+ OPENAL_SetSFXMasterVolume((int)(volume * 255));
+ break;
+ case 12:
+ flash();
+ newstereomode = stereomode;
+ mainmenu = 18;
+ keyselect = -1;
+ break;
+ case 13:
+ showdamagebar = !showdamagebar;
+ break;
+ }
+ updateSettingsMenu();
+ break;
+ case 4:
+ if (!waiting) {
+ fireSound();
+ if (selected < (debugmode ? 10 : 9) && keyselect == -1)
+ keyselect = selected;
+ if (keyselect != -1)
+ setKeySelected();
+ if (selected == (debugmode ? 10 : 9)) {
+ flash();
+ mainmenu = 3;
+ }
+ }
+ updateControlsMenu();
+ break;
+ case 5:
+ fireSound();
+ flash();
+ if ((selected - NB_CAMPAIGN_MENU_ITEM >= accountactive->getCampaignChoicesMade())) {
+ startbonustotal = 0;
+
+ loading = 2;
+ loadtime = 0;
+ targetlevel = 7;
+ if (firstload)
+ TickOnceAfter();
+ else
+ LoadStuff();
+ whichchoice = selected - NB_CAMPAIGN_MENU_ITEM - accountactive->getCampaignChoicesMade();
+ actuallevel = (accountactive->getCampaignChoicesMade() > 0 ? campaignlevels[accountactive->getCampaignChoicesMade() - 1].nextlevel[whichchoice] : 0);
+ visibleloading = 1;
+ stillloading = 1;
+ Loadlevel(campaignlevels[actuallevel].mapname.c_str());
+ campaign = 1;
+ mainmenu = 0;
+ gameon = 1;
+ pause_sound(stream_menutheme);
+ }
+ switch (selected) {
+ case 1:
+ startbonustotal = 0;
+
+ loading = 2;
+ loadtime = 0;
+ targetlevel = -1;
+ if (firstload) {
+ TickOnceAfter();
+ } else
+ LoadStuff();
+ Loadlevel(-1);
+
+ mainmenu = 0;
+ gameon = 1;
+ pause_sound(stream_menutheme);
+ break;
+ case 2:
+ mainmenu = 9;
+ break;
+ case 3:
+ mainmenu = 6;
+ break;
+ case 4:
+ mainmenu = (gameon ? 2 : 1);
+ break;
+ case 5:
+ mainmenu = 7;
+ break;
+ case 6:
+ vector<string> campaigns = ListCampaigns();
+ vector<string>::iterator c;
+ if ((c = find(campaigns.begin(), campaigns.end(), accountactive->getCurrentCampaign())) == campaigns.end()) {
+ if (!campaigns.empty())
+ accountactive->setCurrentCampaign(campaigns.front());
+ } else {
+ c++;
+ if (c == campaigns.end())
+ c = campaigns.begin();
+ accountactive->setCurrentCampaign(*c);
+ }
+ LoadMenu();
+ break;
+ }
+ break;
+ case 6:
+ fireSound();
+ if (selected == 1) {
+ flash();
+ accountactive = Account::destroy(accountactive);
+ mainmenu = 7;
+ } else if (selected == 2) {
+ flash();
+ mainmenu = 5;
+ }
+ break;
+ case 7:
+ fireSound();
+ if (selected == 0 && Account::getNbAccounts() < 8) {
+ entername = 1;
+ } else if (selected < Account::getNbAccounts() + 1) {
+ flash();
+ mainmenu = 5;
+ accountactive = Account::get(selected - 1);
+ } else if (selected == Account::getNbAccounts() + 1) {
+ flash();
+ if (accountactive)
+ mainmenu = 5;
+ else
+ mainmenu = 1;
+ for (int j = 0; j < 255; j++) {
+ displaytext[0][j] = 0;
+ }
+ displaychars[0] = 0;
+ displayselected = 0;
+ entername = 0;
+ }
+ break;
+ case 8:
+ fireSound();
+ flash();
+ if (selected <= 2)
+ accountactive->setDifficulty(selected);
+ mainmenu = 5;
+ break;
+ case 9:
+ if (selected < numchallengelevels && selected <= accountactive->getProgress()) {
+ fireSound();
+ flash();
+
+ startbonustotal = 0;
+
+ loading = 2;
+ loadtime = 0;
+ targetlevel = selected;
+ if (firstload)
+ TickOnceAfter();
+ else
+ LoadStuff();
+ Loadlevel(selected);
+ campaign = 0;
+
+ mainmenu = 0;
+ gameon = 1;
+ pause_sound(stream_menutheme);
+ }
+ if (selected == numchallengelevels) {
+ fireSound();
+ flash();
+ mainmenu = 5;
+ }
+ break;
+ case 10:
+ if (selected == 3) {
+ fireSound();
+ flash();
+ mainmenu = 5;
+ }
+ break;
+ case 18:
+ if (selected == 1)
+ stereoseparation += 0.001;
+ else {
+ fireSound();
+ if (selected == 0) {
+ newstereomode = (StereoMode)(newstereomode + 1);
+ while (!CanInitStereo(newstereomode)) {
+ printf("Failed to initialize mode %s (%i)\n", StereoModeName(newstereomode), newstereomode);
+ newstereomode = (StereoMode)(newstereomode + 1);
+ if (newstereomode >= stereoCount)
+ newstereomode = stereoNone;
+ }
+ } else if (selected == 2) {
+ stereoreverse = !stereoreverse;
+ } else if (selected == 3) {
+ flash();
+ mainmenu = 3;
+
+ stereomode = newstereomode;
+ InitStereo(stereomode);
+ }
+ }
+ updateStereoConfigMenu();
+ break;
+ }
+ }
+
+ if (Input::isKeyDown(SDLK_q) && Input::isKeyDown(SDLK_LMETA)) {
+ tryquit = 1;
+ if (mainmenu == 3) {
SaveSettings();
}
}
OPENAL_SetFrequency(channels[stream_menutheme], 22050);
- if(entername){
- inputText(displaytext[0],&displayselected,&displaychars[0]);
- if(!waiting) { // the input as finished
- if(displaychars[0]){ // with enter
+ if (entername) {
+ inputText(displaytext[0], &displayselected, &displaychars[0]);
+ if (!waiting) { // the input as finished
+ if (displaychars[0]) { // with enter
accountactive = Account::add(string(displaytext[0]));
- mainmenu=8;
+ mainmenu = 8;
flash();
fireSound(firestartsound);
- for(int i=0;i<255;i++){
- displaytext[0][i]=0;
+ for (int i = 0; i < 255; i++) {
+ displaytext[0][i] = 0;
}
- displaychars[0]=0;
+ displaychars[0] = 0;
- displayselected=0;
+ displayselected = 0;
}
- entername=0;
+ entername = 0;
LoadMenu();
}
-
- displayblinkdelay-=multiplier;
- if(displayblinkdelay<=0){
- displayblinkdelay=.3;
- displayblink=1-displayblink;
+
+ displayblinkdelay -= multiplier;
+ if (displayblinkdelay <= 0) {
+ displayblinkdelay = .3;
+ displayblink = 1 - displayblink;
}
}
- if(entername){
- Menu::setText(0,displaytext[0],20,400,-1,-1);
- Menu::setText(-2,displayblink?"_":"",20+displayselected*10,400,-1,-1);
+ if (entername) {
+ Menu::setText(0, displaytext[0], 20, 400, -1, -1);
+ Menu::setText(-2, displayblink ? "_" : "", 20 + displayselected * 10, 400, -1, -1);
}
- if(oldmainmenu!=mainmenu)
+ if (oldmainmenu != mainmenu)
LoadMenu();
- oldmainmenu=mainmenu;
+ oldmainmenu = mainmenu;
}
-void Game::Tick(){
- static XYZ facing,flatfacing;
- static int target;
+void Game::Tick()
+{
+ static XYZ facing, flatfacing;
+ static int target;
- for(int i=0;i<15;i++){
- displaytime[i]+=multiplier;
- }
+ for (int i = 0; i < 15; i++) {
+ displaytime[i] += multiplier;
+ }
- keyboardfrozen=false;
+ keyboardfrozen = false;
Input::Tick();
- if(Input::isKeyPressed(SDLK_F6)){
- if(Input::isKeyDown(SDLK_LSHIFT))
- stereoreverse=true;
- else
- stereoreverse=false;
-
- if(stereoreverse)
- printf("Stereo reversed\n");
- else
- printf("Stereo unreversed\n");
- }
-
- if(Input::isKeyDown(SDLK_F7)){
- if(Input::isKeyDown(SDLK_LSHIFT))
- stereoseparation -= 0.001;
- else
- stereoseparation -= 0.010;
- printf("Stereo decreased increased to %f\n", stereoseparation);
- }
-
- if(Input::isKeyDown(SDLK_F8)){
- if(Input::isKeyDown(SDLK_LSHIFT))
- stereoseparation += 0.001;
- else
- stereoseparation += 0.010;
- printf("Stereo separation increased to %f\n", stereoseparation);
- }
-
-
- if(Input::isKeyPressed(SDLK_TAB)&&tutoriallevel){
- if(tutorialstage!=51)
- tutorialstagetime=tutorialmaxtime;
- emit_sound_np(consolefailsound, 128.);
- }
+ if (Input::isKeyPressed(SDLK_F6)) {
+ if (Input::isKeyDown(SDLK_LSHIFT))
+ stereoreverse = true;
+ else
+ stereoreverse = false;
+
+ if (stereoreverse)
+ printf("Stereo reversed\n");
+ else
+ printf("Stereo unreversed\n");
+ }
+
+ if (Input::isKeyDown(SDLK_F7)) {
+ if (Input::isKeyDown(SDLK_LSHIFT))
+ stereoseparation -= 0.001;
+ else
+ stereoseparation -= 0.010;
+ printf("Stereo decreased increased to %f\n", stereoseparation);
+ }
+
+ if (Input::isKeyDown(SDLK_F8)) {
+ if (Input::isKeyDown(SDLK_LSHIFT))
+ stereoseparation += 0.001;
+ else
+ stereoseparation += 0.010;
+ printf("Stereo separation increased to %f\n", stereoseparation);
+ }
+
+
+ if (Input::isKeyPressed(SDLK_TAB) && tutoriallevel) {
+ if (tutorialstage != 51)
+ tutorialstagetime = tutorialmaxtime;
+ emit_sound_np(consolefailsound, 128.);
+ }
/*
Values of mainmenu :
11 Same that 9 ??? => unused
18 stereo configuration
*/
-
- if(!console) {
+
+ if (!console) {
//campaign over?
- if(mainmenu&&endgame==1)
- mainmenu=10;
+ if (mainmenu && endgame == 1)
+ mainmenu = 10;
//go to level select after completing a campaign level
- if(campaign&&winfreeze&&mainmenu==0&&campaignlevels[actuallevel].choosenext==1) {
- mainmenu=5;
- gameon=0;
- winfreeze=0;
+ if (campaign && winfreeze && mainmenu == 0 && campaignlevels[actuallevel].choosenext == 1) {
+ mainmenu = 5;
+ gameon = 0;
+ winfreeze = 0;
fireSound();
flash();
- if(musictoggle) {
+ if (musictoggle) {
OPENAL_SetFrequency(OPENAL_ALL, 0.001);
emit_stream_np(stream_menutheme);
pause_sound(leveltheme);
}
- LoadMenu();
+ LoadMenu();
}
//escape key pressed
- if(Input::isKeyPressed(SDLK_ESCAPE)&&
- (gameon||mainmenu==0||(mainmenu>=3&&mainmenu!=8&&!(mainmenu==7&&entername)))) {
- selected=-1;
- if(mainmenu==0&&!winfreeze)
- mainmenu=2; //pause
- else if(mainmenu==1||mainmenu==2){
- mainmenu=0; //unpause
+ if (Input::isKeyPressed(SDLK_ESCAPE) &&
+ (gameon || mainmenu == 0 || (mainmenu >= 3 && mainmenu != 8 && !(mainmenu == 7 && entername)))) {
+ selected = -1;
+ if (mainmenu == 0 && !winfreeze)
+ mainmenu = 2; //pause
+ else if (mainmenu == 1 || mainmenu == 2) {
+ mainmenu = 0; //unpause
}
//play menu theme
- if(musictoggle&&(mainmenu==1||mainmenu==2)){
+ if (musictoggle && (mainmenu == 1 || mainmenu == 2)) {
OPENAL_SetFrequency(OPENAL_ALL, 0.001);
emit_stream_np(stream_menutheme);
pause_sound(leveltheme);
}
//on resume, play level music
- if(!mainmenu){
+ if (!mainmenu) {
pause_sound(stream_menutheme);
resume_stream(leveltheme);
}
//finished with settings menu
- if(mainmenu==3){
- SaveSettings();
- }
+ if (mainmenu == 3) {
+ SaveSettings();
+ }
//effects
- if(mainmenu>=3&&mainmenu!=8){
- fireSound();
- flash();
- }
+ if (mainmenu >= 3 && mainmenu != 8) {
+ fireSound();
+ flash();
+ }
//go back
- switch(mainmenu){
- case 3: case 5:
- mainmenu=gameon?2:1; break;
- case 4: case 18:
- mainmenu=3; break;
- case 6: case 7: case 9: case 10:
- mainmenu=5; break;
- }
- }
- }
-
- if(mainmenu) {
+ switch (mainmenu) {
+ case 3:
+ case 5:
+ mainmenu = gameon ? 2 : 1;
+ break;
+ case 4:
+ case 18:
+ mainmenu = 3;
+ break;
+ case 6:
+ case 7:
+ case 9:
+ case 10:
+ mainmenu = 5;
+ break;
+ }
+ }
+ }
+
+ if (mainmenu) {
MenuTick();
- }
+ }
- if(!mainmenu) {
- if(hostile==1)hostiletime+=multiplier;
- else hostiletime=0;
- if(!winfreeze)leveltime+=multiplier;
+ if (!mainmenu) {
+ if (hostile == 1)hostiletime += multiplier;
+ else hostiletime = 0;
+ if (!winfreeze)leveltime += multiplier;
//keys
- if(Input::isKeyPressed(SDLK_v)&&debugmode){
- freeze=1-freeze;
- if(freeze){
- OPENAL_SetFrequency(OPENAL_ALL, 0.001);
- }
- }
-
- if(Input::isKeyPressed(chatkey)&&!console&&!chatting&&debugmode)
- chatting=1;
-
- if(chatting){
- inputText(displaytext[0],&displayselected,&displaychars[0]);
- if(!waiting) {
- if(displaychars[0]){
- for(int j=0;j<255;j++)
- displaytext[0][j]=0;
- displaychars[0]=0;
- displayselected=0;
- }
- chatting=0;
- }
-
- displayblinkdelay-=multiplier;
- if(displayblinkdelay<=0){
- displayblinkdelay=.3;
- displayblink=1-displayblink;
- }
- }
- if(chatting)
- keyboardfrozen=true;
-
- if(Input::isKeyPressed(consolekey)&&debugmode) {
- console=!console;
- if(console) {
- OPENAL_SetFrequency(OPENAL_ALL, 0.001);
- } else {
- freeze=0;
- waiting=false;
- }
- }
-
- if(console)
- freeze=1;
- if(console&&!Input::isKeyDown(SDLK_LMETA)) {
- inputText(consoletext[0],&consoleselected,&consolechars[0]);
- if(!waiting) {
- if(consolechars[0]>0) {
- consoletext[0][consolechars[0]]='\0';
+ if (Input::isKeyPressed(SDLK_v) && debugmode) {
+ freeze = 1 - freeze;
+ if (freeze) {
+ OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+ }
+ }
+
+ if (Input::isKeyPressed(chatkey) && !console && !chatting && debugmode)
+ chatting = 1;
+
+ if (chatting) {
+ inputText(displaytext[0], &displayselected, &displaychars[0]);
+ if (!waiting) {
+ if (displaychars[0]) {
+ for (int j = 0; j < 255; j++)
+ displaytext[0][j] = 0;
+ displaychars[0] = 0;
+ displayselected = 0;
+ }
+ chatting = 0;
+ }
+
+ displayblinkdelay -= multiplier;
+ if (displayblinkdelay <= 0) {
+ displayblinkdelay = .3;
+ displayblink = 1 - displayblink;
+ }
+ }
+ if (chatting)
+ keyboardfrozen = true;
+
+ if (Input::isKeyPressed(consolekey) && debugmode) {
+ console = !console;
+ if (console) {
+ OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+ } else {
+ freeze = 0;
+ waiting = false;
+ }
+ }
+
+ if (console)
+ freeze = 1;
+ if (console && !Input::isKeyDown(SDLK_LMETA)) {
+ inputText(consoletext[0], &consoleselected, &consolechars[0]);
+ if (!waiting) {
+ if (consolechars[0] > 0) {
+ consoletext[0][consolechars[0]] = '\0';
cmd_dispatch(consoletext[0]);
- for(int k=14;k>=1;k--) {
- for(int j=0;j<255;j++)
- consoletext[k][j]=consoletext[k-1][j];
- consolechars[k]=consolechars[k-1];
- }
- for(int j=0;j<255;j++)
- consoletext[0][j]=0;
- consolechars[0]=0;
- consoleselected=0;
- }
- }
-
- consoleblinkdelay-=multiplier;
- if(consoleblinkdelay<=0) {
- consoleblinkdelay=.3;
- consoleblink=1-consoleblink;
- }
- }
-
-
-
- if(Input::isKeyDown(SDLK_q)&&Input::isKeyDown(SDLK_LMETA)){
- tryquit=1;
- if(mainmenu==3) {
- SaveSettings();
- }
- }
-
- static int oldwinfreeze;
- if(winfreeze&&!oldwinfreeze){
- OPENAL_SetFrequency(OPENAL_ALL, 0.001);
- emit_sound_np(consolesuccesssound);
- }
- if(winfreeze==0)
- oldwinfreeze=winfreeze;
- else
+ for (int k = 14; k >= 1; k--) {
+ for (int j = 0; j < 255; j++)
+ consoletext[k][j] = consoletext[k - 1][j];
+ consolechars[k] = consolechars[k - 1];
+ }
+ for (int j = 0; j < 255; j++)
+ consoletext[0][j] = 0;
+ consolechars[0] = 0;
+ consoleselected = 0;
+ }
+ }
+
+ consoleblinkdelay -= multiplier;
+ if (consoleblinkdelay <= 0) {
+ consoleblinkdelay = .3;
+ consoleblink = 1 - consoleblink;
+ }
+ }
+
+
+
+ if (Input::isKeyDown(SDLK_q) && Input::isKeyDown(SDLK_LMETA)) {
+ tryquit = 1;
+ if (mainmenu == 3) {
+ SaveSettings();
+ }
+ }
+
+ static int oldwinfreeze;
+ if (winfreeze && !oldwinfreeze) {
+ OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+ emit_sound_np(consolesuccesssound);
+ }
+ if (winfreeze == 0)
+ oldwinfreeze = winfreeze;
+ else
oldwinfreeze++;
- if((Input::isKeyPressed(jumpkey)||Input::isKeyPressed(SDLK_SPACE))&&!campaign)
- if(winfreeze)
- winfreeze=0;
- if((Input::isKeyDown(SDLK_ESCAPE))&&!campaign&&gameon){
- if(console){
- console=false;
- freeze=0;
- } else if(winfreeze) {
- mainmenu=9;
- gameon=0;
- }
+ if ((Input::isKeyPressed(jumpkey) || Input::isKeyPressed(SDLK_SPACE)) && !campaign)
+ if (winfreeze)
+ winfreeze = 0;
+ if ((Input::isKeyDown(SDLK_ESCAPE)) && !campaign && gameon) {
+ if (console) {
+ console = false;
+ freeze = 0;
+ } else if (winfreeze) {
+ mainmenu = 9;
+ gameon = 0;
+ }
}
- if(!freeze&&!winfreeze&&!(mainmenu&&gameon)&&(gameon||!gamestarted)){
+ if (!freeze && !winfreeze && !(mainmenu && gameon) && (gameon || !gamestarted)) {
//dialogues
static float talkdelay = 0;
- if(indialogue!=-1)
- talkdelay=1;
- talkdelay-=multiplier;
+ if (indialogue != -1)
+ talkdelay = 1;
+ talkdelay -= multiplier;
- if(talkdelay<=0&&indialogue==-1&&animation[player[0].animTarget].height!=highheight)
- for(int i=0;i<numdialogues;i++){
+ if (talkdelay <= 0 && indialogue == -1 && animation[player[0].animTarget].height != highheight)
+ for (int i = 0; i < numdialogues; i++) {
int realdialoguetype;
bool special;
- if(dialoguetype[i]>49){
- realdialoguetype=dialoguetype[i]-50;
- special=1;
+ if (dialoguetype[i] > 49) {
+ realdialoguetype = dialoguetype[i] - 50;
+ special = 1;
+ } else if (dialoguetype[i] > 39) {
+ realdialoguetype = dialoguetype[i] - 40;
+ special = 1;
+ } else if (dialoguetype[i] > 29) {
+ realdialoguetype = dialoguetype[i] - 30;
+ special = 1;
+ } else if (dialoguetype[i] > 19) {
+ realdialoguetype = dialoguetype[i] - 20;
+ special = 1;
+ } else if (dialoguetype[i] > 9) {
+ realdialoguetype = dialoguetype[i] - 10;
+ special = 1;
+ } else {
+ realdialoguetype = dialoguetype[i];
+ special = 0;
}
- else if(dialoguetype[i]>39){
- realdialoguetype=dialoguetype[i]-40;
- special=1;
- }
- else if(dialoguetype[i]>29){
- realdialoguetype=dialoguetype[i]-30;
- special=1;
- }
- else if(dialoguetype[i]>19){
- realdialoguetype=dialoguetype[i]-20;
- special=1;
- }
- else if(dialoguetype[i]>9){
- realdialoguetype=dialoguetype[i]-10;
- special=1;
- }
- else {
- realdialoguetype=dialoguetype[i];
- special=0;
- }
- if((!hostile||dialoguetype[i]>40&&dialoguetype[i]<50)&&
- realdialoguetype<numplayers&&
- realdialoguetype>0&&
- (dialoguegonethrough[i]==0||!special)&&
- (special||Input::isKeyPressed(attackkey))){
- if(distsq(&player[0].coords,&player[realdialoguetype].coords)<6||
- player[realdialoguetype].howactive>=typedead1||
- dialoguetype[i]>40&&dialoguetype[i]<50){
- whichdialogue=i;
- for(int j=0;j<numdialogueboxes[whichdialogue];j++){
- player[participantfocus[whichdialogue][j]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
- player[participantfocus[whichdialogue][j]].yaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
- player[participantfocus[whichdialogue][j]].targetyaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
- player[participantfocus[whichdialogue][j]].velocity=0;
- player[participantfocus[whichdialogue][j]].animTarget=player[participantfocus[whichdialogue][j]].getIdle();
- player[participantfocus[whichdialogue][j]].frameTarget=0;
+ if ((!hostile || dialoguetype[i] > 40 && dialoguetype[i] < 50) &&
+ realdialoguetype < numplayers &&
+ realdialoguetype > 0 &&
+ (dialoguegonethrough[i] == 0 || !special) &&
+ (special || Input::isKeyPressed(attackkey))) {
+ if (distsq(&player[0].coords, &player[realdialoguetype].coords) < 6 ||
+ player[realdialoguetype].howactive >= typedead1 ||
+ dialoguetype[i] > 40 && dialoguetype[i] < 50) {
+ whichdialogue = i;
+ for (int j = 0; j < numdialogueboxes[whichdialogue]; j++) {
+ player[participantfocus[whichdialogue][j]].coords = participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].yaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].targetyaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].velocity = 0;
+ player[participantfocus[whichdialogue][j]].animTarget = player[participantfocus[whichdialogue][j]].getIdle();
+ player[participantfocus[whichdialogue][j]].frameTarget = 0;
}
- directing=0;
- indialogue=0;
- dialoguetime=0;
+ directing = 0;
+ indialogue = 0;
+ dialoguetime = 0;
dialoguegonethrough[i]++;
- if(dialogueboxsound[whichdialogue][indialogue]!=0){
+ if (dialogueboxsound[whichdialogue][indialogue] != 0) {
playdialogueboxsound();
}
}
}
}
- windvar+=multiplier;
- smoketex+=multiplier;
- tutorialstagetime+=multiplier;
+ windvar += multiplier;
+ smoketex += multiplier;
+ tutorialstagetime += multiplier;
//hotspots
static float hotspotvisual[40];
- if(numhotspots){
+ if (numhotspots) {
XYZ hotspotsprite;
- if(editorenabled)
- for(int i=0;i<numhotspots;i++)
- hotspotvisual[i]-=multiplier/320;
+ if (editorenabled)
+ for (int i = 0; i < numhotspots; i++)
+ hotspotvisual[i] -= multiplier / 320;
- for(int i=0;i<numhotspots;i++){
+ for (int i = 0; i < numhotspots; i++) {
//if(hotspottype[i]<=10)
- while(hotspotvisual[i]<0){
- hotspotsprite=0;
- hotspotsprite.x=float(abs(Random()%100000))/100000*hotspotsize[i];
- hotspotsprite=DoRotation(hotspotsprite,0,0,Random()%360);
- hotspotsprite=DoRotation(hotspotsprite,0,Random()%360,0);
- hotspotsprite+=hotspot[i];
- Sprite::MakeSprite(breathsprite, hotspotsprite, hotspotsprite*0, 1,0.5,0, 7, 0.4);
- hotspotvisual[i]+=0.1/hotspotsize[i]/hotspotsize[i]/hotspotsize[i];
+ while (hotspotvisual[i] < 0) {
+ hotspotsprite = 0;
+ hotspotsprite.x = float(abs(Random() % 100000)) / 100000 * hotspotsize[i];
+ hotspotsprite = DoRotation(hotspotsprite, 0, 0, Random() % 360);
+ hotspotsprite = DoRotation(hotspotsprite, 0, Random() % 360, 0);
+ hotspotsprite += hotspot[i];
+ Sprite::MakeSprite(breathsprite, hotspotsprite, hotspotsprite * 0, 1, 0.5, 0, 7, 0.4);
+ hotspotvisual[i] += 0.1 / hotspotsize[i] / hotspotsize[i] / hotspotsize[i];
}
}
- for(int i=0;i<numhotspots;i++){
- if(hotspottype[i]<=10&&hotspottype[i]>0){
- hotspot[i]=player[hotspottype[i]].coords;
+ for (int i = 0; i < numhotspots; i++) {
+ if (hotspottype[i] <= 10 && hotspottype[i] > 0) {
+ hotspot[i] = player[hotspottype[i]].coords;
}
}
}
//Tutorial
- if(tutoriallevel){
+ if (tutoriallevel) {
doTutorial();
}
//bonuses
- if(tutoriallevel!=1){
- if(bonustime==0&&
- bonus!=solidhit&&
- bonus!=spinecrusher&&
- bonus!=tracheotomy&&
- bonus!=backstab&&
- bonusvalue>10){
+ if (tutoriallevel != 1) {
+ if (bonustime == 0 &&
+ bonus != solidhit &&
+ bonus != spinecrusher &&
+ bonus != tracheotomy &&
+ bonus != backstab &&
+ bonusvalue > 10) {
emit_sound_np(consolesuccesssound);
}
- } else if(bonustime==0){
+ } else if (bonustime == 0) {
emit_sound_np(fireendsound);
}
- if(bonustime==0){
- if(bonus!=solidhit&&
- bonus!=twoxcombo&&
- bonus!=threexcombo&&
- bonus!=fourxcombo&&
- bonus!=megacombo)
+ if (bonustime == 0) {
+ if (bonus != solidhit &&
+ bonus != twoxcombo &&
+ bonus != threexcombo &&
+ bonus != fourxcombo &&
+ bonus != megacombo)
bonusnum[bonus]++;
else
- bonusnum[bonus]+=0.15;
- if(tutoriallevel)
- bonusvalue=0;
- bonusvalue/=bonusnum[bonus];
- bonustotal+=bonusvalue;
+ bonusnum[bonus] += 0.15;
+ if (tutoriallevel)
+ bonusvalue = 0;
+ bonusvalue /= bonusnum[bonus];
+ bonustotal += bonusvalue;
}
- bonustime+=multiplier;
+ bonustime += multiplier;
//snow effects
- if(environment==snowyenvironment){
- precipdelay-=multiplier;
- while(precipdelay<0){
- precipdelay+=.04;
- if(!detail)
- precipdelay+=.04;
- XYZ footvel,footpoint;
-
- footvel=0;
- footpoint=viewer+viewerfacing*6;
- footpoint.y+=((float)abs(Random()%1200))/100-6;
- footpoint.x+=((float)abs(Random()%1200))/100-6;
- footpoint.z+=((float)abs(Random()%1200))/100-6;
- Sprite::MakeSprite(snowsprite, footpoint,footvel, 1,1,1, .1, 1);
+ if (environment == snowyenvironment) {
+ precipdelay -= multiplier;
+ while (precipdelay < 0) {
+ precipdelay += .04;
+ if (!detail)
+ precipdelay += .04;
+ XYZ footvel, footpoint;
+
+ footvel = 0;
+ footpoint = viewer + viewerfacing * 6;
+ footpoint.y += ((float)abs(Random() % 1200)) / 100 - 6;
+ footpoint.x += ((float)abs(Random() % 1200)) / 100 - 6;
+ footpoint.z += ((float)abs(Random() % 1200)) / 100 - 6;
+ Sprite::MakeSprite(snowsprite, footpoint, footvel, 1, 1, 1, .1, 1);
}
}
static XYZ oldviewer;
//control keys
- if(indialogue==-1){
- player[0].forwardkeydown=Input::isKeyDown(forwardkey);
- player[0].leftkeydown=Input::isKeyDown(leftkey);
- player[0].backkeydown=Input::isKeyDown(backkey);
- player[0].rightkeydown=Input::isKeyDown(rightkey);
- player[0].jumpkeydown=Input::isKeyDown(jumpkey);
- player[0].crouchkeydown=Input::isKeyDown(crouchkey);
- player[0].drawkeydown=Input::isKeyDown(drawkey);
- player[0].throwkeydown=Input::isKeyDown(throwkey);
+ if (indialogue == -1) {
+ player[0].forwardkeydown = Input::isKeyDown(forwardkey);
+ player[0].leftkeydown = Input::isKeyDown(leftkey);
+ player[0].backkeydown = Input::isKeyDown(backkey);
+ player[0].rightkeydown = Input::isKeyDown(rightkey);
+ player[0].jumpkeydown = Input::isKeyDown(jumpkey);
+ player[0].crouchkeydown = Input::isKeyDown(crouchkey);
+ player[0].drawkeydown = Input::isKeyDown(drawkey);
+ player[0].throwkeydown = Input::isKeyDown(throwkey);
+ } else {
+ player[0].forwardkeydown = 0;
+ player[0].leftkeydown = 0;
+ player[0].backkeydown = 0;
+ player[0].rightkeydown = 0;
+ player[0].jumpkeydown = 0;
+ player[0].crouchkeydown = 0;
+ player[0].drawkeydown = 0;
+ player[0].throwkeydown = 0;
}
- else
- {
- player[0].forwardkeydown=0;
- player[0].leftkeydown=0;
- player[0].backkeydown=0;
- player[0].rightkeydown=0;
- player[0].jumpkeydown=0;
- player[0].crouchkeydown=0;
- player[0].drawkeydown=0;
- player[0].throwkeydown=0;
- }
-
- if(!player[0].jumpkeydown)
- player[0].jumpclimb=0;
-
-
- if(indialogue!=-1){
- cameramode=1;
- if(directing){
- facing=0;
- facing.z=-1;
-
- facing=DoRotation(facing,-pitch,0,0);
- facing=DoRotation(facing,0,0-yaw,0);
-
- flatfacing=0;
- flatfacing.z=-1;
-
- flatfacing=DoRotation(flatfacing,0,-yaw,0);
-
- if(Input::isKeyDown(forwardkey))
- viewer+=facing*multiplier*4;
- if(Input::isKeyDown(backkey))
- viewer-=facing*multiplier*4;
- if(Input::isKeyDown(leftkey))
- viewer+=DoRotation(flatfacing*multiplier,0,90,0)*4;
- if(Input::isKeyDown(rightkey))
- viewer+=DoRotation(flatfacing*multiplier,0,-90,0)*4;
- if(Input::isKeyDown(jumpkey))
- viewer.y+=multiplier*4;
- if(Input::isKeyDown(crouchkey))
- viewer.y-=multiplier*4;
- if( Input::isKeyPressed(SDLK_1)||
- Input::isKeyPressed(SDLK_2)||
- Input::isKeyPressed(SDLK_3)||
- Input::isKeyPressed(SDLK_4)||
- Input::isKeyPressed(SDLK_5)||
- Input::isKeyPressed(SDLK_6)||
- Input::isKeyPressed(SDLK_7)||
- Input::isKeyPressed(SDLK_8)||
- Input::isKeyPressed(SDLK_9)||
- Input::isKeyPressed(SDLK_0)||
- Input::isKeyPressed(SDLK_MINUS)){
+
+ if (!player[0].jumpkeydown)
+ player[0].jumpclimb = 0;
+
+
+ if (indialogue != -1) {
+ cameramode = 1;
+ if (directing) {
+ facing = 0;
+ facing.z = -1;
+
+ facing = DoRotation(facing, -pitch, 0, 0);
+ facing = DoRotation(facing, 0, 0 - yaw, 0);
+
+ flatfacing = 0;
+ flatfacing.z = -1;
+
+ flatfacing = DoRotation(flatfacing, 0, -yaw, 0);
+
+ if (Input::isKeyDown(forwardkey))
+ viewer += facing * multiplier * 4;
+ if (Input::isKeyDown(backkey))
+ viewer -= facing * multiplier * 4;
+ if (Input::isKeyDown(leftkey))
+ viewer += DoRotation(flatfacing * multiplier, 0, 90, 0) * 4;
+ if (Input::isKeyDown(rightkey))
+ viewer += DoRotation(flatfacing * multiplier, 0, -90, 0) * 4;
+ if (Input::isKeyDown(jumpkey))
+ viewer.y += multiplier * 4;
+ if (Input::isKeyDown(crouchkey))
+ viewer.y -= multiplier * 4;
+ if ( Input::isKeyPressed(SDLK_1) ||
+ Input::isKeyPressed(SDLK_2) ||
+ Input::isKeyPressed(SDLK_3) ||
+ Input::isKeyPressed(SDLK_4) ||
+ Input::isKeyPressed(SDLK_5) ||
+ Input::isKeyPressed(SDLK_6) ||
+ Input::isKeyPressed(SDLK_7) ||
+ Input::isKeyPressed(SDLK_8) ||
+ Input::isKeyPressed(SDLK_9) ||
+ Input::isKeyPressed(SDLK_0) ||
+ Input::isKeyPressed(SDLK_MINUS)) {
int whichend;
- if(Input::isKeyPressed(SDLK_1))whichend=1;
- if(Input::isKeyPressed(SDLK_2))whichend=2;
- if(Input::isKeyPressed(SDLK_3))whichend=3;
- if(Input::isKeyPressed(SDLK_4))whichend=4;
- if(Input::isKeyPressed(SDLK_5))whichend=5;
- if(Input::isKeyPressed(SDLK_6))whichend=6;
- if(Input::isKeyPressed(SDLK_7))whichend=7;
- if(Input::isKeyPressed(SDLK_8))whichend=8;
- if(Input::isKeyPressed(SDLK_9))whichend=9;
- if(Input::isKeyPressed(SDLK_0))whichend=0;
- if(Input::isKeyPressed(SDLK_MINUS))
- whichend=-1;
- if(whichend!=-1){
- participantfocus[whichdialogue][indialogue]=whichend;
- participantlocation[whichdialogue][whichend]=player[whichend].coords;
- participantyaw[whichdialogue][whichend]=player[whichend].yaw;
+ if (Input::isKeyPressed(SDLK_1))whichend = 1;
+ if (Input::isKeyPressed(SDLK_2))whichend = 2;
+ if (Input::isKeyPressed(SDLK_3))whichend = 3;
+ if (Input::isKeyPressed(SDLK_4))whichend = 4;
+ if (Input::isKeyPressed(SDLK_5))whichend = 5;
+ if (Input::isKeyPressed(SDLK_6))whichend = 6;
+ if (Input::isKeyPressed(SDLK_7))whichend = 7;
+ if (Input::isKeyPressed(SDLK_8))whichend = 8;
+ if (Input::isKeyPressed(SDLK_9))whichend = 9;
+ if (Input::isKeyPressed(SDLK_0))whichend = 0;
+ if (Input::isKeyPressed(SDLK_MINUS))
+ whichend = -1;
+ if (whichend != -1) {
+ participantfocus[whichdialogue][indialogue] = whichend;
+ participantlocation[whichdialogue][whichend] = player[whichend].coords;
+ participantyaw[whichdialogue][whichend] = player[whichend].yaw;
}
- if(whichend==-1){
- participantfocus[whichdialogue][indialogue]=-1;
+ if (whichend == -1) {
+ participantfocus[whichdialogue][indialogue] = -1;
}
- if(player[participantfocus[whichdialogue][indialogue]].dead){
- indialogue=-1;
- directing=0;
- cameramode=0;
+ if (player[participantfocus[whichdialogue][indialogue]].dead) {
+ indialogue = -1;
+ directing = 0;
+ cameramode = 0;
}
- dialoguecamera[whichdialogue][indialogue]=viewer;
- dialoguecamerayaw[whichdialogue][indialogue]=yaw;
- dialoguecamerapitch[whichdialogue][indialogue]=pitch;
+ dialoguecamera[whichdialogue][indialogue] = viewer;
+ dialoguecamerayaw[whichdialogue][indialogue] = yaw;
+ dialoguecamerapitch[whichdialogue][indialogue] = pitch;
indialogue++;
- if(indialogue<numdialogueboxes[whichdialogue]){
- if(dialogueboxsound[whichdialogue][indialogue]!=0){
+ if (indialogue < numdialogueboxes[whichdialogue]) {
+ if (dialogueboxsound[whichdialogue][indialogue] != 0) {
playdialogueboxsound();
}
}
- for(int j=0;j<numplayers;j++){
- participantfacing[whichdialogue][indialogue][j]=participantfacing[whichdialogue][indialogue-1][j];
+ for (int j = 0; j < numplayers; j++) {
+ participantfacing[whichdialogue][indialogue][j] = participantfacing[whichdialogue][indialogue - 1][j];
}
}
//TODO: should these be KeyDown or KeyPressed?
- if( Input::isKeyDown(SDLK_KP1)||
- Input::isKeyDown(SDLK_KP2)||
- Input::isKeyDown(SDLK_KP3)||
- Input::isKeyDown(SDLK_KP4)||
- Input::isKeyDown(SDLK_KP5)||
- Input::isKeyDown(SDLK_KP6)||
- Input::isKeyDown(SDLK_KP7)||
- Input::isKeyDown(SDLK_KP8)||
- Input::isKeyDown(SDLK_KP9)||
- Input::isKeyDown(SDLK_KP0)){
+ if ( Input::isKeyDown(SDLK_KP1) ||
+ Input::isKeyDown(SDLK_KP2) ||
+ Input::isKeyDown(SDLK_KP3) ||
+ Input::isKeyDown(SDLK_KP4) ||
+ Input::isKeyDown(SDLK_KP5) ||
+ Input::isKeyDown(SDLK_KP6) ||
+ Input::isKeyDown(SDLK_KP7) ||
+ Input::isKeyDown(SDLK_KP8) ||
+ Input::isKeyDown(SDLK_KP9) ||
+ Input::isKeyDown(SDLK_KP0)) {
int whichend;
- if(Input::isKeyDown(SDLK_KP1))whichend=1;
- if(Input::isKeyDown(SDLK_KP2))whichend=2;
- if(Input::isKeyDown(SDLK_KP3))whichend=3;
- if(Input::isKeyDown(SDLK_KP4))whichend=4;
- if(Input::isKeyDown(SDLK_KP5))whichend=5;
- if(Input::isKeyDown(SDLK_KP6))whichend=6;
- if(Input::isKeyDown(SDLK_KP7))whichend=7;
- if(Input::isKeyDown(SDLK_KP8))whichend=8;
- if(Input::isKeyDown(SDLK_KP9))whichend=9;
- if(Input::isKeyDown(SDLK_KP0))whichend=0;
- participantfacing[whichdialogue][indialogue][whichend]=facing;
+ if (Input::isKeyDown(SDLK_KP1))whichend = 1;
+ if (Input::isKeyDown(SDLK_KP2))whichend = 2;
+ if (Input::isKeyDown(SDLK_KP3))whichend = 3;
+ if (Input::isKeyDown(SDLK_KP4))whichend = 4;
+ if (Input::isKeyDown(SDLK_KP5))whichend = 5;
+ if (Input::isKeyDown(SDLK_KP6))whichend = 6;
+ if (Input::isKeyDown(SDLK_KP7))whichend = 7;
+ if (Input::isKeyDown(SDLK_KP8))whichend = 8;
+ if (Input::isKeyDown(SDLK_KP9))whichend = 9;
+ if (Input::isKeyDown(SDLK_KP0))whichend = 0;
+ participantfacing[whichdialogue][indialogue][whichend] = facing;
}
- if(indialogue>=numdialogueboxes[whichdialogue]){
- indialogue=-1;
- directing=0;
- cameramode=0;
+ if (indialogue >= numdialogueboxes[whichdialogue]) {
+ indialogue = -1;
+ directing = 0;
+ cameramode = 0;
}
}
- if(!directing){
+ if (!directing) {
pause_sound(whooshsound);
- viewer=dialoguecamera[whichdialogue][indialogue];
- viewer.y=max((double)viewer.y,terrain.getHeight(viewer.x,viewer.z)+.1);
- yaw=dialoguecamerayaw[whichdialogue][indialogue];
- pitch=dialoguecamerapitch[whichdialogue][indialogue];
- if(dialoguetime>0.5)
- if( Input::isKeyPressed(SDLK_1)||
- Input::isKeyPressed(SDLK_2)||
- Input::isKeyPressed(SDLK_3)||
- Input::isKeyPressed(SDLK_4)||
- Input::isKeyPressed(SDLK_5)||
- Input::isKeyPressed(SDLK_6)||
- Input::isKeyPressed(SDLK_7)||
- Input::isKeyPressed(SDLK_8)||
- Input::isKeyPressed(SDLK_9)||
- Input::isKeyPressed(SDLK_0)||
- Input::isKeyPressed(SDLK_MINUS)||
- Input::isKeyPressed(attackkey)){
+ viewer = dialoguecamera[whichdialogue][indialogue];
+ viewer.y = max((double)viewer.y, terrain.getHeight(viewer.x, viewer.z) + .1);
+ yaw = dialoguecamerayaw[whichdialogue][indialogue];
+ pitch = dialoguecamerapitch[whichdialogue][indialogue];
+ if (dialoguetime > 0.5)
+ if ( Input::isKeyPressed(SDLK_1) ||
+ Input::isKeyPressed(SDLK_2) ||
+ Input::isKeyPressed(SDLK_3) ||
+ Input::isKeyPressed(SDLK_4) ||
+ Input::isKeyPressed(SDLK_5) ||
+ Input::isKeyPressed(SDLK_6) ||
+ Input::isKeyPressed(SDLK_7) ||
+ Input::isKeyPressed(SDLK_8) ||
+ Input::isKeyPressed(SDLK_9) ||
+ Input::isKeyPressed(SDLK_0) ||
+ Input::isKeyPressed(SDLK_MINUS) ||
+ Input::isKeyPressed(attackkey)) {
indialogue++;
- if(indialogue<numdialogueboxes[whichdialogue]){
- if(dialogueboxsound[whichdialogue][indialogue]!=0){
+ if (indialogue < numdialogueboxes[whichdialogue]) {
+ if (dialogueboxsound[whichdialogue][indialogue] != 0) {
playdialogueboxsound();
- if(dialogueboxsound[whichdialogue][indialogue]==-5){
- hotspot[numhotspots]=player[0].coords;
- hotspotsize[numhotspots]=10;
- hotspottype[numhotspots]=-1;
+ if (dialogueboxsound[whichdialogue][indialogue] == -5) {
+ hotspot[numhotspots] = player[0].coords;
+ hotspotsize[numhotspots] = 10;
+ hotspottype[numhotspots] = -1;
numhotspots++;
}
- if(dialogueboxsound[whichdialogue][indialogue]==-6){
- hostile=1;
+ if (dialogueboxsound[whichdialogue][indialogue] == -6) {
+ hostile = 1;
}
- if(player[participantfocus[whichdialogue][indialogue]].dead){
- indialogue=-1;
- directing=0;
- cameramode=0;
+ if (player[participantfocus[whichdialogue][indialogue]].dead) {
+ indialogue = -1;
+ directing = 0;
+ cameramode = 0;
}
}
}
}
- if(indialogue>=numdialogueboxes[whichdialogue]){
- indialogue=-1;
- directing=0;
- cameramode=0;
- if(dialoguetype[whichdialogue]>19&&dialoguetype[whichdialogue]<30){
- hostile=1;
+ if (indialogue >= numdialogueboxes[whichdialogue]) {
+ indialogue = -1;
+ directing = 0;
+ cameramode = 0;
+ if (dialoguetype[whichdialogue] > 19 && dialoguetype[whichdialogue] < 30) {
+ hostile = 1;
}
- if(dialoguetype[whichdialogue]>29&&dialoguetype[whichdialogue]<40){
- windialogue=true;
+ if (dialoguetype[whichdialogue] > 29 && dialoguetype[whichdialogue] < 40) {
+ windialogue = true;
}
- if(dialoguetype[whichdialogue]>49&&dialoguetype[whichdialogue]<60){
- hostile=1;
- for(int i=1;i<numplayers;i++){
+ if (dialoguetype[whichdialogue] > 49 && dialoguetype[whichdialogue] < 60) {
+ hostile = 1;
+ for (int i = 1; i < numplayers; i++) {
player[i].aitype = attacktypecutoff;
}
}
}
}
- if(!player[0].jumpkeydown){
- player[0].jumptogglekeydown=0;
+ if (!player[0].jumpkeydown) {
+ player[0].jumptogglekeydown = 0;
}
- if(player[0].jumpkeydown&&
- player[0].animTarget!=jumpupanim&&
- player[0].animTarget!=jumpdownanim&&
+ if (player[0].jumpkeydown &&
+ player[0].animTarget != jumpupanim &&
+ player[0].animTarget != jumpdownanim &&
!player[0].isFlip())
- player[0].jumptogglekeydown=1;
+ player[0].jumptogglekeydown = 1;
- dialoguetime+=multiplier;
- hawkyaw+=multiplier*25;
- realhawkcoords=0;
- realhawkcoords.x=25;
- realhawkcoords=DoRotation(realhawkcoords,0,hawkyaw,0)+hawkcoords;
- hawkcalldelay-=multiplier/2;
+ dialoguetime += multiplier;
+ hawkyaw += multiplier * 25;
+ realhawkcoords = 0;
+ realhawkcoords.x = 25;
+ realhawkcoords = DoRotation(realhawkcoords, 0, hawkyaw, 0) + hawkcoords;
+ hawkcalldelay -= multiplier / 2;
- if(hawkcalldelay<=0){
+ if (hawkcalldelay <= 0) {
emit_sound_at(hawksound, realhawkcoords);
- hawkcalldelay=16+abs(Random()%8);
+ hawkcalldelay = 16 + abs(Random() % 8);
}
doDebugKeys();
doJumpReversals();
- for(int k=0;k<numplayers;k++)
- if(k!=0&&player[k].immobile)
- player[k].coords=player[k].realoldcoords;
+ for (int k = 0; k < numplayers; k++)
+ if (k != 0 && player[k].immobile)
+ player[k].coords = player[k].realoldcoords;
- for(int k=0;k<numplayers;k++){
- if(!isnormal(player[k].coords.x)||!isnormal(player[k].coords.y)||!isnormal(player[k].coords.z)){
- if(!isnormal(player[k].coords.x)||!isnormal(player[k].coords.y)||!isnormal(player[k].coords.z)){
+ for (int k = 0; k < numplayers; k++) {
+ if (!isnormal(player[k].coords.x) || !isnormal(player[k].coords.y) || !isnormal(player[k].coords.z)) {
+ if (!isnormal(player[k].coords.x) || !isnormal(player[k].coords.y) || !isnormal(player[k].coords.z)) {
player[k].DoDamage(1000);
}
}
//respawn
static bool respawnkeydown;
- if(!editorenabled&&
- (whichlevel!=-2&&
- (Input::isKeyDown(SDLK_z)&&
- Input::isKeyDown(SDLK_LMETA)&&
- debugmode)||
- (Input::isKeyDown(jumpkey)&&
- !respawnkeydown&&
- !oldattackkey&&
- player[0].dead))){
- targetlevel=whichlevel;
- loading=1;
- leveltime=5;
+ if (!editorenabled &&
+ (whichlevel != -2 &&
+ (Input::isKeyDown(SDLK_z) &&
+ Input::isKeyDown(SDLK_LMETA) &&
+ debugmode) ||
+ (Input::isKeyDown(jumpkey) &&
+ !respawnkeydown &&
+ !oldattackkey &&
+ player[0].dead))) {
+ targetlevel = whichlevel;
+ loading = 1;
+ leveltime = 5;
}
- if(!Input::isKeyDown(jumpkey))
- respawnkeydown=0;
- if(Input::isKeyDown(jumpkey))
- respawnkeydown=1;
+ if (!Input::isKeyDown(jumpkey))
+ respawnkeydown = 0;
+ if (Input::isKeyDown(jumpkey))
+ respawnkeydown = 1;
static bool movekey;
//?
- for(int i=0;i<numplayers;i++){
+ for (int i = 0; i < numplayers; i++) {
static float oldtargetyaw;
- if(!player[i].skeleton.free){
- oldtargetyaw=player[i].targetyaw;
- if(i==0&&indialogue==-1){
+ if (!player[i].skeleton.free) {
+ oldtargetyaw = player[i].targetyaw;
+ if (i == 0 && indialogue == -1) {
//TODO: refactor repetitive code
- if(!animation[player[0].animTarget].attack&&
- player[0].animTarget!=staggerbackhighanim&&
- player[0].animTarget!=staggerbackhardanim&&
- player[0].animTarget!=crouchremoveknifeanim&&
- player[0].animTarget!=removeknifeanim&&
- player[0].animTarget!=backhandspringanim&&
- player[0].animTarget!=dodgebackanim&&
- player[0].animTarget!=walljumprightkickanim&&
- player[0].animTarget!=walljumpleftkickanim){
- if(cameramode)
- player[0].targetyaw=0;
+ if (!animation[player[0].animTarget].attack &&
+ player[0].animTarget != staggerbackhighanim &&
+ player[0].animTarget != staggerbackhardanim &&
+ player[0].animTarget != crouchremoveknifeanim &&
+ player[0].animTarget != removeknifeanim &&
+ player[0].animTarget != backhandspringanim &&
+ player[0].animTarget != dodgebackanim &&
+ player[0].animTarget != walljumprightkickanim &&
+ player[0].animTarget != walljumpleftkickanim) {
+ if (cameramode)
+ player[0].targetyaw = 0;
else
- player[0].targetyaw=-yaw+180;
+ player[0].targetyaw = -yaw + 180;
}
- facing=0;
- facing.z=-1;
+ facing = 0;
+ facing.z = -1;
- flatfacing=DoRotation(facing,0,player[i].yaw+180,0);
- if(cameramode){
- facing=flatfacing;
- }else{
- facing=DoRotation(facing,-pitch,0,0);
- facing=DoRotation(facing,0,0-yaw,0);
+ flatfacing = DoRotation(facing, 0, player[i].yaw + 180, 0);
+ if (cameramode) {
+ facing = flatfacing;
+ } else {
+ facing = DoRotation(facing, -pitch, 0, 0);
+ facing = DoRotation(facing, 0, 0 - yaw, 0);
}
- player[0].lookyaw=-yaw;
+ player[0].lookyaw = -yaw;
- player[i].targetheadyaw=yaw;
- player[i].targetheadpitch=pitch;
+ player[i].targetheadyaw = yaw;
+ player[i].targetheadpitch = pitch;
}
- if(i!=0&&player[i].aitype==playercontrolled&&indialogue==-1){
- if(!animation[player[i].animTarget].attack&&
- player[i].animTarget!=staggerbackhighanim&&
- player[i].animTarget!=staggerbackhardanim&&
- player[i].animTarget!=crouchremoveknifeanim&&
- player[i].animTarget!=removeknifeanim&&
- player[i].animTarget!=backhandspringanim&&
- player[i].animTarget!=dodgebackanim&&
- player[i].animTarget!=walljumprightkickanim&&
- player[i].animTarget!=walljumpleftkickanim){
- player[i].targetyaw=-player[i].lookyaw+180;
+ if (i != 0 && player[i].aitype == playercontrolled && indialogue == -1) {
+ if (!animation[player[i].animTarget].attack &&
+ player[i].animTarget != staggerbackhighanim &&
+ player[i].animTarget != staggerbackhardanim &&
+ player[i].animTarget != crouchremoveknifeanim &&
+ player[i].animTarget != removeknifeanim &&
+ player[i].animTarget != backhandspringanim &&
+ player[i].animTarget != dodgebackanim &&
+ player[i].animTarget != walljumprightkickanim &&
+ player[i].animTarget != walljumpleftkickanim) {
+ player[i].targetyaw = -player[i].lookyaw + 180;
}
- facing=0;
- facing.z=-1;
+ facing = 0;
+ facing.z = -1;
- flatfacing=DoRotation(facing,0,player[i].yaw+180,0);
+ flatfacing = DoRotation(facing, 0, player[i].yaw + 180, 0);
- facing=DoRotation(facing,-player[i].lookpitch,0,0);
- facing=DoRotation(facing,0,0-player[i].lookyaw,0);
+ facing = DoRotation(facing, -player[i].lookpitch, 0, 0);
+ facing = DoRotation(facing, 0, 0 - player[i].lookyaw, 0);
- player[i].targetheadyaw=player[i].lookyaw;
- player[i].targetheadpitch=player[i].lookpitch;
+ player[i].targetheadyaw = player[i].lookyaw;
+ player[i].targetheadpitch = player[i].lookpitch;
}
- if(indialogue!=-1){
- player[i].targetheadyaw=180-roughDirection(participantfacing[whichdialogue][indialogue][i]);
- player[i].targetheadpitch=pitchOf(participantfacing[whichdialogue][indialogue][i]);
+ if (indialogue != -1) {
+ player[i].targetheadyaw = 180 - roughDirection(participantfacing[whichdialogue][indialogue][i]);
+ player[i].targetheadpitch = pitchOf(participantfacing[whichdialogue][indialogue][i]);
}
- if(leveltime<.5)
- numenvsounds=0;
+ if (leveltime < .5)
+ numenvsounds = 0;
- player[i].avoidsomething=0;
+ player[i].avoidsomething = 0;
//avoid flaming things
- for(int j=0;j<objects.numobjects;j++)
- if(objects.onfire[j])
- if(distsq(&player[i].coords,&objects.position[j])<sq(objects.scale[j])*200)
- if( distsq(&player[i].coords,&objects.position[j])<
- distsq(&player[i].coords,&player[0].coords)){
- player[i].collided=0;
- player[i].avoidcollided=1;
- if(player[i].avoidsomething==0||
- distsq(&player[i].coords,&objects.position[j])<
- distsq(&player[i].coords,&player[i].avoidwhere)){
- player[i].avoidwhere=objects.position[j];
- player[i].avoidsomething=1;
+ for (int j = 0; j < objects.numobjects; j++)
+ if (objects.onfire[j])
+ if (distsq(&player[i].coords, &objects.position[j]) < sq(objects.scale[j]) * 200)
+ if ( distsq(&player[i].coords, &objects.position[j]) <
+ distsq(&player[i].coords, &player[0].coords)) {
+ player[i].collided = 0;
+ player[i].avoidcollided = 1;
+ if (player[i].avoidsomething == 0 ||
+ distsq(&player[i].coords, &objects.position[j]) <
+ distsq(&player[i].coords, &player[i].avoidwhere)) {
+ player[i].avoidwhere = objects.position[j];
+ player[i].avoidsomething = 1;
}
}
//avoid flaming players
- for(int j=0;j<numplayers;j++)
- if(player[j].onfire)
- if(distsq(&player[j].coords,&player[i].coords)<sq(0.3)*200)
- if( distsq(&player[i].coords,&player[j].coords)<
- distsq(&player[i].coords,&player[0].coords)){
- player[i].collided=0;
- player[i].avoidcollided=1;
- if(player[i].avoidsomething==0||
- distsq(&player[i].coords,&player[j].coords)<
- distsq(&player[i].coords,&player[i].avoidwhere)){
- player[i].avoidwhere=player[j].coords;
- player[i].avoidsomething=1;
+ for (int j = 0; j < numplayers; j++)
+ if (player[j].onfire)
+ if (distsq(&player[j].coords, &player[i].coords) < sq(0.3) * 200)
+ if ( distsq(&player[i].coords, &player[j].coords) <
+ distsq(&player[i].coords, &player[0].coords)) {
+ player[i].collided = 0;
+ player[i].avoidcollided = 1;
+ if (player[i].avoidsomething == 0 ||
+ distsq(&player[i].coords, &player[j].coords) <
+ distsq(&player[i].coords, &player[i].avoidwhere)) {
+ player[i].avoidwhere = player[j].coords;
+ player[i].avoidsomething = 1;
}
}
- if(player[i].collided>.8)
- player[i].avoidcollided=0;
+ if (player[i].collided > .8)
+ player[i].avoidcollided = 0;
doAI(i);
- if(animation[player[i].animTarget].attack==reversed){
+ if (animation[player[i].animTarget].attack == reversed) {
//player[i].targetyaw=player[i].yaw;
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].attackkeydown=0;
+ player[i].forwardkeydown = 0;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].jumpkeydown = 0;
+ player[i].attackkeydown = 0;
//player[i].crouchkeydown=0;
- player[i].throwkeydown=0;
+ player[i].throwkeydown = 0;
}
- if(indialogue!=-1){
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].crouchkeydown=0;
- player[i].drawkeydown=0;
- player[i].throwkeydown=0;
+ if (indialogue != -1) {
+ player[i].forwardkeydown = 0;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].jumpkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].drawkeydown = 0;
+ player[i].throwkeydown = 0;
}
- if(player[i].collided<-.3)
- player[i].collided=-.3;
- if(player[i].collided>1)
- player[i].collided=1;
- player[i].collided-=multiplier*4;
- player[i].whichdirectiondelay-=multiplier;
- if(player[i].avoidcollided<-.3||player[i].whichdirectiondelay<=0){
- player[i].avoidcollided=-.3;
- player[i].whichdirection=abs(Random()%2);
- player[i].whichdirectiondelay=.4;
+ if (player[i].collided < -.3)
+ player[i].collided = -.3;
+ if (player[i].collided > 1)
+ player[i].collided = 1;
+ player[i].collided -= multiplier * 4;
+ player[i].whichdirectiondelay -= multiplier;
+ if (player[i].avoidcollided < -.3 || player[i].whichdirectiondelay <= 0) {
+ player[i].avoidcollided = -.3;
+ player[i].whichdirection = abs(Random() % 2);
+ player[i].whichdirectiondelay = .4;
}
- if(player[i].avoidcollided>1)
- player[i].avoidcollided=1;
- player[i].avoidcollided-=multiplier/4;
- if(!player[i].skeleton.free){
- player[i].stunned-=multiplier;
- player[i].surprised-=multiplier;
+ if (player[i].avoidcollided > 1)
+ player[i].avoidcollided = 1;
+ player[i].avoidcollided -= multiplier / 4;
+ if (!player[i].skeleton.free) {
+ player[i].stunned -= multiplier;
+ player[i].surprised -= multiplier;
}
- if(i!=0&&player[i].surprised<=0&&
- player[i].aitype==attacktypecutoff&&
- !player[i].dead&&
- !player[i].skeleton.free&&
- animation[player[i].animTarget].attack==neutral)
- numresponded=1;
+ if (i != 0 && player[i].surprised <= 0 &&
+ player[i].aitype == attacktypecutoff &&
+ !player[i].dead &&
+ !player[i].skeleton.free &&
+ animation[player[i].animTarget].attack == neutral)
+ numresponded = 1;
- if(!player[i].throwkeydown)
- player[i].throwtogglekeydown=0;
+ if (!player[i].throwkeydown)
+ player[i].throwtogglekeydown = 0;
//pick up weapon
- if(player[i].throwkeydown&&!player[i].throwtogglekeydown){
- if(player[i].weaponactive==-1&&
- player[i].num_weapons<2&&
- (player[i].isIdle()||
- player[i].isCrouch()||
- player[i].animTarget==sneakanim||
- player[i].animTarget==rollanim||
- player[i].animTarget==backhandspringanim||
- player[i].isFlip()||
- player[i].isFlip()||
- player[i].aitype!=playercontrolled)){
- for(int j=0;j<weapons.size();j++){
- if((weapons[j].velocity.x==0&&weapons[j].velocity.y==0&&weapons[j].velocity.z==0||
- player[i].aitype==playercontrolled)&&
- weapons[j].owner==-1&&
- player[i].weaponactive==-1)
- if(distsqflat(&player[i].coords,&weapons[j].position)<2){
- if(distsq(&player[i].coords,&weapons[j].position)<2){
- if(player[i].isCrouch()||
- player[i].animTarget==sneakanim||
- player[i].isRun()||
- player[i].isIdle()||
- player[i].aitype!=playercontrolled){
- player[i].throwtogglekeydown=1;
+ if (player[i].throwkeydown && !player[i].throwtogglekeydown) {
+ if (player[i].weaponactive == -1 &&
+ player[i].num_weapons < 2 &&
+ (player[i].isIdle() ||
+ player[i].isCrouch() ||
+ player[i].animTarget == sneakanim ||
+ player[i].animTarget == rollanim ||
+ player[i].animTarget == backhandspringanim ||
+ player[i].isFlip() ||
+ player[i].isFlip() ||
+ player[i].aitype != playercontrolled)) {
+ for (int j = 0; j < weapons.size(); j++) {
+ if ((weapons[j].velocity.x == 0 && weapons[j].velocity.y == 0 && weapons[j].velocity.z == 0 ||
+ player[i].aitype == playercontrolled) &&
+ weapons[j].owner == -1 &&
+ player[i].weaponactive == -1)
+ if (distsqflat(&player[i].coords, &weapons[j].position) < 2) {
+ if (distsq(&player[i].coords, &weapons[j].position) < 2) {
+ if (player[i].isCrouch() ||
+ player[i].animTarget == sneakanim ||
+ player[i].isRun() ||
+ player[i].isIdle() ||
+ player[i].aitype != playercontrolled) {
+ player[i].throwtogglekeydown = 1;
player[i].setAnimation(crouchremoveknifeanim);
- player[i].targetyaw=roughDirectionTo(player[i].coords,weapons[j].position);
- player[i].hasvictim=0;
+ player[i].targetyaw = roughDirectionTo(player[i].coords, weapons[j].position);
+ player[i].hasvictim = 0;
}
- if(player[i].animTarget==rollanim||player[i].animTarget==backhandspringanim){
- player[i].throwtogglekeydown=1;
- player[i].hasvictim=0;
-
- if((weapons[j].velocity.x==0&&weapons[j].velocity.y==0&&weapons[j].velocity.z==0||
- player[i].aitype==playercontrolled)&&
- weapons[j].owner==-1||
- player[i].victim&&
- weapons[j].owner==player[i].victim->id)
- if(distsqflat(&player[i].coords,&weapons[j].position)<2&&player[i].weaponactive==-1)
- if(distsq(&player[i].coords,&weapons[j].position)<1||player[i].victim){
- if(weapons[j].getType()!=staff)
+ if (player[i].animTarget == rollanim || player[i].animTarget == backhandspringanim) {
+ player[i].throwtogglekeydown = 1;
+ player[i].hasvictim = 0;
+
+ if ((weapons[j].velocity.x == 0 && weapons[j].velocity.y == 0 && weapons[j].velocity.z == 0 ||
+ player[i].aitype == playercontrolled) &&
+ weapons[j].owner == -1 ||
+ player[i].victim &&
+ weapons[j].owner == player[i].victim->id)
+ if (distsqflat(&player[i].coords, &weapons[j].position) < 2 && player[i].weaponactive == -1)
+ if (distsq(&player[i].coords, &weapons[j].position) < 1 || player[i].victim) {
+ if (weapons[j].getType() != staff)
emit_sound_at(knifedrawsound, player[i].coords, 128.);
- player[i].weaponactive=0;
- weapons[j].owner=player[i].id;
- if(player[i].num_weapons>0)
- player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+ player[i].weaponactive = 0;
+ weapons[j].owner = player[i].id;
+ if (player[i].num_weapons > 0)
+ player[i].weaponids[player[i].num_weapons] = player[i].weaponids[0];
player[i].num_weapons++;
- player[i].weaponids[0]=j;
+ player[i].weaponids[0] = j;
}
}
- }else if((player[i].isIdle()||
- player[i].isFlip()||
- player[i].aitype!=playercontrolled)&&
- distsq(&player[i].coords,&weapons[j].position)<5&&
- player[i].coords.y<weapons[j].position.y){
- if(!player[i].isFlip()){
- player[i].throwtogglekeydown=1;
+ } else if ((player[i].isIdle() ||
+ player[i].isFlip() ||
+ player[i].aitype != playercontrolled) &&
+ distsq(&player[i].coords, &weapons[j].position) < 5 &&
+ player[i].coords.y < weapons[j].position.y) {
+ if (!player[i].isFlip()) {
+ player[i].throwtogglekeydown = 1;
player[i].setAnimation(removeknifeanim);
- player[i].targetyaw=roughDirectionTo(player[i].coords,weapons[j].position);
+ player[i].targetyaw = roughDirectionTo(player[i].coords, weapons[j].position);
}
- if(player[i].isFlip()){
- player[i].throwtogglekeydown=1;
- player[i].hasvictim=0;
-
- for(int k=0;k<weapons.size();k++){
- if(player[i].weaponactive==-1)
- if((weapons[k].velocity.x==0&&weapons[k].velocity.y==0&&weapons[k].velocity.z==0||
- player[i].aitype==playercontrolled)&&
- weapons[k].owner==-1||
- player[i].victim&&
- weapons[k].owner==player[i].victim->id)
- if(distsqflat(&player[i].coords,&weapons[k].position)<3&&
- player[i].weaponactive==-1){
- if(weapons[k].getType()!=staff)
+ if (player[i].isFlip()) {
+ player[i].throwtogglekeydown = 1;
+ player[i].hasvictim = 0;
+
+ for (int k = 0; k < weapons.size(); k++) {
+ if (player[i].weaponactive == -1)
+ if ((weapons[k].velocity.x == 0 && weapons[k].velocity.y == 0 && weapons[k].velocity.z == 0 ||
+ player[i].aitype == playercontrolled) &&
+ weapons[k].owner == -1 ||
+ player[i].victim &&
+ weapons[k].owner == player[i].victim->id)
+ if (distsqflat(&player[i].coords, &weapons[k].position) < 3 &&
+ player[i].weaponactive == -1) {
+ if (weapons[k].getType() != staff)
emit_sound_at(knifedrawsound, player[i].coords, 128.);
- player[i].weaponactive=0;
- weapons[k].owner=player[i].id;
- if(player[i].num_weapons>0)
- player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+ player[i].weaponactive = 0;
+ weapons[k].owner = player[i].id;
+ if (player[i].num_weapons > 0)
+ player[i].weaponids[player[i].num_weapons] = player[i].weaponids[0];
player[i].num_weapons++;
- player[i].weaponids[0]=k;
+ player[i].weaponids[0] = k;
}
}
}
}
}
}
- if(player[i].isCrouch()||
- player[i].animTarget==sneakanim||
- player[i].isRun()||
- player[i].isIdle()||player[i].animTarget==rollanim||
- player[i].animTarget==backhandspringanim){
- if(numplayers>1)
- for(int j=0;j<numplayers;j++){
- if(player[i].weaponactive==-1)
- if(j!=i)
- if(player[j].num_weapons&&
- player[j].skeleton.free&&
- distsq(&player[i].coords,&player[j].coords)<2/*&&player[j].dead*/&&
- (((player[j].skeleton.forward.y<0&&
- player[j].weaponstuckwhere==0)||
- (player[j].skeleton.forward.y>0&&
- player[j].weaponstuckwhere==1))||
- player[j].weaponstuck==-1||
- player[j].num_weapons>1)){
- if(player[i].animTarget!=rollanim&&player[i].animTarget!=backhandspringanim){
- player[i].throwtogglekeydown=1;
- player[i].victim=&player[j];
- player[i].hasvictim=1;
+ if (player[i].isCrouch() ||
+ player[i].animTarget == sneakanim ||
+ player[i].isRun() ||
+ player[i].isIdle() || player[i].animTarget == rollanim ||
+ player[i].animTarget == backhandspringanim) {
+ if (numplayers > 1)
+ for (int j = 0; j < numplayers; j++) {
+ if (player[i].weaponactive == -1)
+ if (j != i)
+ if (player[j].num_weapons &&
+ player[j].skeleton.free &&
+ distsq(&player[i].coords, &player[j].coords) < 2/*&&player[j].dead*/ &&
+ (((player[j].skeleton.forward.y < 0 &&
+ player[j].weaponstuckwhere == 0) ||
+ (player[j].skeleton.forward.y > 0 &&
+ player[j].weaponstuckwhere == 1)) ||
+ player[j].weaponstuck == -1 ||
+ player[j].num_weapons > 1)) {
+ if (player[i].animTarget != rollanim && player[i].animTarget != backhandspringanim) {
+ player[i].throwtogglekeydown = 1;
+ player[i].victim = &player[j];
+ player[i].hasvictim = 1;
player[i].setAnimation(crouchremoveknifeanim);
- player[i].targetyaw=roughDirectionTo(player[i].coords,player[j].coords);
+ player[i].targetyaw = roughDirectionTo(player[i].coords, player[j].coords);
}
- if(player[i].animTarget==rollanim||player[i].animTarget==backhandspringanim){
- player[i].throwtogglekeydown=1;
- player[i].victim=&player[j];
- player[i].hasvictim=1;
+ if (player[i].animTarget == rollanim || player[i].animTarget == backhandspringanim) {
+ player[i].throwtogglekeydown = 1;
+ player[i].victim = &player[j];
+ player[i].hasvictim = 1;
int k = player[j].weaponids[0];
- if(player[i].hasvictim){
+ if (player[i].hasvictim) {
bool fleshstuck;
- fleshstuck=0;
- if(player[i].victim->weaponstuck!=-1){
- if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){
- fleshstuck=1;
+ fleshstuck = 0;
+ if (player[i].victim->weaponstuck != -1) {
+ if (player[i].victim->weaponids[player[i].victim->weaponstuck] == k) {
+ fleshstuck = 1;
}
}
- if(!fleshstuck){
- if(weapons[k].getType()!=staff)
- emit_sound_at(knifedrawsound, player[i].coords, 128.);
+ if (!fleshstuck) {
+ if (weapons[k].getType() != staff)
+ emit_sound_at(knifedrawsound, player[i].coords, 128.);
}
- if(fleshstuck)
- emit_sound_at(fleshstabremovesound, player[i].coords, 128.);
+ if (fleshstuck)
+ emit_sound_at(fleshstabremovesound, player[i].coords, 128.);
- player[i].weaponactive=0;
- if(weapons[k].owner!=-1){
- if(player[i].victim->num_weapons==1)player[i].victim->num_weapons=0;
- else player[i].victim->num_weapons=1;
+ player[i].weaponactive = 0;
+ if (weapons[k].owner != -1) {
+ if (player[i].victim->num_weapons == 1)player[i].victim->num_weapons = 0;
+ else player[i].victim->num_weapons = 1;
- player[i].victim->skeleton.longdead=0;
- player[i].victim->skeleton.free=1;
- player[i].victim->skeleton.broken=0;
+ player[i].victim->skeleton.longdead = 0;
+ player[i].victim->skeleton.free = 1;
+ player[i].victim->skeleton.broken = 0;
- for(int l=0;l<player[i].victim->skeleton.num_joints;l++){
- player[i].victim->skeleton.joints[l].velchange=0;
- player[i].victim->skeleton.joints[l].locked=0;
+ for (int l = 0; l < player[i].victim->skeleton.num_joints; l++) {
+ player[i].victim->skeleton.joints[l].velchange = 0;
+ player[i].victim->skeleton.joints[l].locked = 0;
}
XYZ relative;
- relative=0;
- relative.y=10;
+ relative = 0;
+ relative.y = 10;
Normalise(&relative);
- XYZ footvel,footpoint;
- footvel=0;
- footpoint=weapons[k].position;
- if(player[i].victim->weaponstuck!=-1){
- if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){
- if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
- weapons[k].bloody=2;
- weapons[k].blooddrip=5;
- player[i].victim->weaponstuck=-1;
- player[i].victim->bloodloss+=2000;
+ XYZ footvel, footpoint;
+ footvel = 0;
+ footpoint = weapons[k].position;
+ if (player[i].victim->weaponstuck != -1) {
+ if (player[i].victim->weaponids[player[i].victim->weaponstuck] == k) {
+ if (bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .8, .3);
+ weapons[k].bloody = 2;
+ weapons[k].blooddrip = 5;
+ player[i].victim->weaponstuck = -1;
+ player[i].victim->bloodloss += 2000;
player[i].victim->DoDamage(2000);
}
}
- if(player[i].victim->num_weapons>0){
- if(player[i].victim->weaponstuck!=0&&player[i].victim->weaponstuck!=-1)player[i].victim->weaponstuck=0;
- if(player[i].victim->weaponids[0]==k)
- player[i].victim->weaponids[0]=player[i].victim->weaponids[player[i].victim->num_weapons];
+ if (player[i].victim->num_weapons > 0) {
+ if (player[i].victim->weaponstuck != 0 && player[i].victim->weaponstuck != -1)player[i].victim->weaponstuck = 0;
+ if (player[i].victim->weaponids[0] == k)
+ player[i].victim->weaponids[0] = player[i].victim->weaponids[player[i].victim->num_weapons];
}
- player[i].victim->weaponactive=-1;
+ player[i].victim->weaponactive = -1;
- player[i].victim->jointVel(abdomen)+=relative*6;
- player[i].victim->jointVel(neck)+=relative*6;
- player[i].victim->jointVel(rightshoulder)+=relative*6;
- player[i].victim->jointVel(leftshoulder)+=relative*6;
+ player[i].victim->jointVel(abdomen) += relative * 6;
+ player[i].victim->jointVel(neck) += relative * 6;
+ player[i].victim->jointVel(rightshoulder) += relative * 6;
+ player[i].victim->jointVel(leftshoulder) += relative * 6;
}
- weapons[k].owner=i;
- if(player[i].num_weapons>0){
- player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+ weapons[k].owner = i;
+ if (player[i].num_weapons > 0) {
+ player[i].weaponids[player[i].num_weapons] = player[i].weaponids[0];
}
player[i].num_weapons++;
- player[i].weaponids[0]=k;
+ player[i].weaponids[0] = k;
}
}
}
}
}
}
- if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){
- if(weapons[player[i].weaponids[0]].getType()==knife){
- if(player[i].isIdle()||
- player[i].isRun()||
- player[i].isCrouch()||
- player[i].animTarget==sneakanim||
+ if (player[i].weaponactive != -1 && player[i].aitype == playercontrolled) {
+ if (weapons[player[i].weaponids[0]].getType() == knife) {
+ if (player[i].isIdle() ||
+ player[i].isRun() ||
+ player[i].isCrouch() ||
+ player[i].animTarget == sneakanim ||
player[i].isFlip())
- if(numplayers>1)
- for(int j=0;j<numplayers;j++){
- if(i!=j)
- if(tutoriallevel!=1||tutorialstage==49)
- if(hostile)
- if(normaldotproduct(player[i].facing,player[i].coords-player[j].coords)<0&&
- distsq(&player[i].coords,&player[j].coords)<100&&
- distsq(&player[i].coords,&player[j].coords)>1.5&&
- !player[j].skeleton.free&&
- -1==checkcollide(DoRotation(player[j].jointPos(head),0,player[j].yaw,0)*player[j].scale+player[j].coords,DoRotation(player[i].jointPos(head),0,player[i].yaw,0)*player[i].scale+player[i].coords)){
- if(!player[i].isFlip()){
- player[i].throwtogglekeydown=1;
- player[i].victim=&player[j];
+ if (numplayers > 1)
+ for (int j = 0; j < numplayers; j++) {
+ if (i != j)
+ if (tutoriallevel != 1 || tutorialstage == 49)
+ if (hostile)
+ if (normaldotproduct(player[i].facing, player[i].coords - player[j].coords) < 0 &&
+ distsq(&player[i].coords, &player[j].coords) < 100 &&
+ distsq(&player[i].coords, &player[j].coords) > 1.5 &&
+ !player[j].skeleton.free &&
+ -1 == checkcollide(DoRotation(player[j].jointPos(head), 0, player[j].yaw, 0)*player[j].scale + player[j].coords, DoRotation(player[i].jointPos(head), 0, player[i].yaw, 0)*player[i].scale + player[i].coords)) {
+ if (!player[i].isFlip()) {
+ player[i].throwtogglekeydown = 1;
+ player[i].victim = &player[j];
player[i].setAnimation(knifethrowanim);
- player[i].targetyaw=roughDirectionTo(player[i].coords,player[j].coords);
- player[i].targettilt2=pitchTo(player[i].coords,player[j].coords);
+ player[i].targetyaw = roughDirectionTo(player[i].coords, player[j].coords);
+ player[i].targettilt2 = pitchTo(player[i].coords, player[j].coords);
}
- if(player[i].isFlip()){
- if(player[i].weaponactive!=-1){
- player[i].throwtogglekeydown=1;
- player[i].victim=&player[j];
+ if (player[i].isFlip()) {
+ if (player[i].weaponactive != -1) {
+ player[i].throwtogglekeydown = 1;
+ player[i].victim = &player[j];
XYZ aim;
- weapons[player[i].weaponids[0]].owner=-1;
- aim=player[i].victim->coords+DoRotation(player[i].victim->jointPos(abdomen),0,player[i].victim->yaw,0)*player[i].victim->scale+player[i].victim->velocity*findDistance(&player[i].victim->coords,&player[i].coords)/50-(player[i].coords+DoRotation(player[i].jointPos(righthand),0,player[i].yaw,0)*player[i].scale);
+ weapons[player[i].weaponids[0]].owner = -1;
+ aim = player[i].victim->coords + DoRotation(player[i].victim->jointPos(abdomen), 0, player[i].victim->yaw, 0) * player[i].victim->scale + player[i].victim->velocity * findDistance(&player[i].victim->coords, &player[i].coords) / 50 - (player[i].coords + DoRotation(player[i].jointPos(righthand), 0, player[i].yaw, 0) * player[i].scale);
Normalise(&aim);
- aim=DoRotation(aim,(float)abs(Random()%30)-15,(float)abs(Random()%30)-15,0);
+ aim = DoRotation(aim, (float)abs(Random() % 30) - 15, (float)abs(Random() % 30) - 15, 0);
- weapons[player[i].weaponids[0]].velocity=aim*50;
- weapons[player[i].weaponids[0]].tipvelocity=aim*50;
- weapons[player[i].weaponids[0]].missed=0;
- weapons[player[i].weaponids[0]].freetime=0;
- weapons[player[i].weaponids[0]].firstfree=1;
- weapons[player[i].weaponids[0]].physics=0;
+ weapons[player[i].weaponids[0]].velocity = aim * 50;
+ weapons[player[i].weaponids[0]].tipvelocity = aim * 50;
+ weapons[player[i].weaponids[0]].missed = 0;
+ weapons[player[i].weaponids[0]].freetime = 0;
+ weapons[player[i].weaponids[0]].firstfree = 1;
+ weapons[player[i].weaponids[0]].physics = 0;
player[i].num_weapons--;
- if(player[i].num_weapons){
- player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons];
+ if (player[i].num_weapons) {
+ player[i].weaponids[0] = player[i].weaponids[player[i].num_weapons];
}
- player[i].weaponactive=-1;
+ player[i].weaponactive = -1;
}
}
}
}
}
}
- if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){
- if(player[i].isCrouch()||player[i].animTarget==sneakanim){
- player[i].throwtogglekeydown=1;
- weapons[player[i].weaponids[0]].owner=-1;
- weapons[player[i].weaponids[0]].velocity=player[i].velocity*.2;
- if(weapons[player[i].weaponids[0]].velocity.x==0)weapons[player[i].weaponids[0]].velocity.x=.1;
- weapons[player[i].weaponids[0]].tipvelocity=weapons[player[i].weaponids[0]].velocity;
- weapons[player[i].weaponids[0]].missed=1;
- weapons[player[i].weaponids[0]].freetime=0;
- weapons[player[i].weaponids[0]].firstfree=1;
- weapons[player[i].weaponids[0]].physics=1;
+ if (player[i].weaponactive != -1 && player[i].aitype == playercontrolled) {
+ if (player[i].isCrouch() || player[i].animTarget == sneakanim) {
+ player[i].throwtogglekeydown = 1;
+ weapons[player[i].weaponids[0]].owner = -1;
+ weapons[player[i].weaponids[0]].velocity = player[i].velocity * .2;
+ if (weapons[player[i].weaponids[0]].velocity.x == 0)weapons[player[i].weaponids[0]].velocity.x = .1;
+ weapons[player[i].weaponids[0]].tipvelocity = weapons[player[i].weaponids[0]].velocity;
+ weapons[player[i].weaponids[0]].missed = 1;
+ weapons[player[i].weaponids[0]].freetime = 0;
+ weapons[player[i].weaponids[0]].firstfree = 1;
+ weapons[player[i].weaponids[0]].physics = 1;
player[i].num_weapons--;
- if(player[i].num_weapons){
- player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons];
- if(player[i].weaponstuck==player[i].num_weapons)player[i].weaponstuck=0;
+ if (player[i].num_weapons) {
+ player[i].weaponids[0] = player[i].weaponids[player[i].num_weapons];
+ if (player[i].weaponstuck == player[i].num_weapons)player[i].weaponstuck = 0;
}
- player[i].weaponactive=-1;
- for(int j=0;j<numplayers;j++){
- player[j].wentforweapon=0;
+ player[i].weaponactive = -1;
+ for (int j = 0; j < numplayers; j++) {
+ player[j].wentforweapon = 0;
}
}
}
}
//draw weapon
- if(i==0||!player[0].dead||player[i].weaponactive!=-1) {
- if(player[i].drawkeydown&&!player[i].drawtogglekeydown||
- player[i].num_weapons==2&&
- player[i].weaponactive==-1&&
- player[i].isIdle()||
- player[0].dead&&
- player[i].weaponactive!=-1&&
- i!=0) {
- bool isgood=true;
- if(player[i].weaponactive!=-1)
- if(weapons[player[i].weaponids[player[i].weaponactive]].getType()==staff)
- isgood=false;
- if(isgood&&player[i].creature!=wolftype){
- if(player[i].isIdle()&&player[i].num_weapons&&weapons[player[i].weaponids[0]].getType()==knife){
+ if (i == 0 || !player[0].dead || player[i].weaponactive != -1) {
+ if (player[i].drawkeydown && !player[i].drawtogglekeydown ||
+ player[i].num_weapons == 2 &&
+ player[i].weaponactive == -1 &&
+ player[i].isIdle() ||
+ player[0].dead &&
+ player[i].weaponactive != -1 &&
+ i != 0) {
+ bool isgood = true;
+ if (player[i].weaponactive != -1)
+ if (weapons[player[i].weaponids[player[i].weaponactive]].getType() == staff)
+ isgood = false;
+ if (isgood && player[i].creature != wolftype) {
+ if (player[i].isIdle() && player[i].num_weapons && weapons[player[i].weaponids[0]].getType() == knife) {
player[i].setAnimation(drawrightanim);
- player[i].drawtogglekeydown=1;
+ player[i].drawtogglekeydown = 1;
}
- if((player[i].isIdle()||
- (player[i].aitype!=playercontrolled&&
- player[0].weaponactive!=-1&&
- player[i].isRun()))&&
- player[i].num_weapons&&
- weapons[player[i].weaponids[0]].getType()==sword){
+ if ((player[i].isIdle() ||
+ (player[i].aitype != playercontrolled &&
+ player[0].weaponactive != -1 &&
+ player[i].isRun())) &&
+ player[i].num_weapons &&
+ weapons[player[i].weaponids[0]].getType() == sword) {
player[i].setAnimation(drawleftanim);
- player[i].drawtogglekeydown=1;
+ player[i].drawtogglekeydown = 1;
}
- if(player[i].isCrouch()&&player[i].num_weapons&&weapons[player[i].weaponids[0]].getType()==knife){
+ if (player[i].isCrouch() && player[i].num_weapons && weapons[player[i].weaponids[0]].getType() == knife) {
player[i].setAnimation(crouchdrawrightanim);
- player[i].drawtogglekeydown=1;
+ player[i].drawtogglekeydown = 1;
}
}
}
}
-
+
//clean weapon
- if(player[i].weaponactive!=-1) {
- if (player[i].isCrouch()&&
- weapons[player[i].weaponids[player[i].weaponactive]].bloody&&
- bloodtoggle&&
- player[i].onterrain&&
- player[i].num_weapons&&
- player[i].attackkeydown&&
- musictype!=stream_fighttheme) {
- if(weapons[player[i].weaponids[player[i].weaponactive]].getType()==knife)
- player[i].setAnimation(crouchstabanim);
- if(weapons[player[i].weaponids[player[i].weaponactive]].getType()==sword)
- player[i].setAnimation(swordgroundstabanim);
- player[i].hasvictim=0;
- }
- }
-
- if(!player[i].drawkeydown)
- player[i].drawtogglekeydown=0;
+ if (player[i].weaponactive != -1) {
+ if (player[i].isCrouch() &&
+ weapons[player[i].weaponids[player[i].weaponactive]].bloody &&
+ bloodtoggle &&
+ player[i].onterrain &&
+ player[i].num_weapons &&
+ player[i].attackkeydown &&
+ musictype != stream_fighttheme) {
+ if (weapons[player[i].weaponids[player[i].weaponactive]].getType() == knife)
+ player[i].setAnimation(crouchstabanim);
+ if (weapons[player[i].weaponids[player[i].weaponactive]].getType() == sword)
+ player[i].setAnimation(swordgroundstabanim);
+ player[i].hasvictim = 0;
+ }
+ }
+
+ if (!player[i].drawkeydown)
+ player[i].drawtogglekeydown = 0;
XYZ absflatfacing;
- if(i==0) {
- absflatfacing=0;
- absflatfacing.z=-1;
+ if (i == 0) {
+ absflatfacing = 0;
+ absflatfacing.z = -1;
- absflatfacing=DoRotation(absflatfacing,0,-yaw,0);
+ absflatfacing = DoRotation(absflatfacing, 0, -yaw, 0);
} else
- absflatfacing=flatfacing;
-
- if(indialogue!=-1){
- player[i].forwardkeydown=0;
- player[i].leftkeydown=0;
- player[i].backkeydown=0;
- player[i].rightkeydown=0;
- player[i].jumpkeydown=0;
- player[i].crouchkeydown=0;
- player[i].drawkeydown=0;
- player[i].throwkeydown=0;
+ absflatfacing = flatfacing;
+
+ if (indialogue != -1) {
+ player[i].forwardkeydown = 0;
+ player[i].leftkeydown = 0;
+ player[i].backkeydown = 0;
+ player[i].rightkeydown = 0;
+ player[i].jumpkeydown = 0;
+ player[i].crouchkeydown = 0;
+ player[i].drawkeydown = 0;
+ player[i].throwkeydown = 0;
}
- movekey=0;
+ movekey = 0;
//Do controls
- if(!animation[player[i].animTarget].attack&&
- player[i].animTarget!=staggerbackhighanim&&
- player[i].animTarget!=staggerbackhardanim&&
- player[i].animTarget!=backhandspringanim&&
- player[i].animTarget!=dodgebackanim){
- if(!player[i].forwardkeydown)
- player[i].forwardstogglekeydown=0;
- if(player[i].crouchkeydown){
+ if (!animation[player[i].animTarget].attack &&
+ player[i].animTarget != staggerbackhighanim &&
+ player[i].animTarget != staggerbackhardanim &&
+ player[i].animTarget != backhandspringanim &&
+ player[i].animTarget != dodgebackanim) {
+ if (!player[i].forwardkeydown)
+ player[i].forwardstogglekeydown = 0;
+ if (player[i].crouchkeydown) {
//Crouch
- target=-2;
- if(i==0){
- player[i].superruntoggle=1;
- if(numplayers>1)
- for(int j=0;j<numplayers;j++)
- if(j!=i&&!player[j].skeleton.free&&player[j].aitype==passivetype)
- if(distsq(&player[j].coords,&player[i].coords)<16)
- player[i].superruntoggle=0;
+ target = -2;
+ if (i == 0) {
+ player[i].superruntoggle = 1;
+ if (numplayers > 1)
+ for (int j = 0; j < numplayers; j++)
+ if (j != i && !player[j].skeleton.free && player[j].aitype == passivetype)
+ if (distsq(&player[j].coords, &player[i].coords) < 16)
+ player[i].superruntoggle = 0;
}
- if(numplayers>1)
- for(int j=0;j<numplayers;j++){
- if(j!=i&&!player[j].skeleton.free&&player[j].victim&&player[i].lowreversaldelay<=0){
- if(distsq(&player[j].coords,&player[j].victim->coords)<3&&
- player[j].victim==&player[i]&&
- (player[j].animTarget==sweepanim||
- player[j].animTarget==upunchanim||
- player[j].animTarget==wolfslapanim||
- ((player[j].animTarget==swordslashanim||
- player[j].animTarget==knifeslashstartanim||
- player[j].animTarget==staffhitanim||
- player[j].animTarget==staffspinhitanim)&&
- distsq(&player[j].coords,&player[i].coords)<2))){
- if(target>=0)
- target=-1;
+ if (numplayers > 1)
+ for (int j = 0; j < numplayers; j++) {
+ if (j != i && !player[j].skeleton.free && player[j].victim && player[i].lowreversaldelay <= 0) {
+ if (distsq(&player[j].coords, &player[j].victim->coords) < 3 &&
+ player[j].victim == &player[i] &&
+ (player[j].animTarget == sweepanim ||
+ player[j].animTarget == upunchanim ||
+ player[j].animTarget == wolfslapanim ||
+ ((player[j].animTarget == swordslashanim ||
+ player[j].animTarget == knifeslashstartanim ||
+ player[j].animTarget == staffhitanim ||
+ player[j].animTarget == staffspinhitanim) &&
+ distsq(&player[j].coords, &player[i].coords) < 2))) {
+ if (target >= 0)
+ target = -1;
else
- target=j;
+ target = j;
}
}
}
- if(target>=0)
+ if (target >= 0)
player[target].Reverse();
- player[i].lowreversaldelay=.5;
+ player[i].lowreversaldelay = .5;
- if(player[i].isIdle()){
+ if (player[i].isIdle()) {
player[i].setAnimation(player[i].getCrouch());
- player[i].transspeed=10;
+ player[i].transspeed = 10;
}
- if(player[i].isRun()||
- (player[i].isStop()&&
- (player[i].leftkeydown||
- player[i].rightkeydown||
- player[i].forwardkeydown||
- player[i].backkeydown))){
+ if (player[i].isRun() ||
+ (player[i].isStop() &&
+ (player[i].leftkeydown ||
+ player[i].rightkeydown ||
+ player[i].forwardkeydown ||
+ player[i].backkeydown))) {
player[i].setAnimation(rollanim);
- player[i].transspeed=20;
+ player[i].transspeed = 20;
}
}
- if(!player[i].crouchkeydown){
+ if (!player[i].crouchkeydown) {
//Uncrouch
- if(!player[i].isRun()&&player[i].animTarget!=sneakanim&&i==0)player[i].superruntoggle=0;
- target=-2;
- if(player[i].isCrouch()){
- if(numplayers>1)
- for(int j=0;j<numplayers;j++){
- if(j!=i&&
- !player[j].skeleton.free&&
- player[j].victim&&
- player[i].highreversaldelay<=0){
- if(distsq(&player[j].coords,&player[j].victim->coords)<3&&
- player[j].victim==&player[i]&&
- (player[j].animTarget==spinkickanim)&&
- player[i].isCrouch()){
- if(target>=0)
- target=-1;
+ if (!player[i].isRun() && player[i].animTarget != sneakanim && i == 0)player[i].superruntoggle = 0;
+ target = -2;
+ if (player[i].isCrouch()) {
+ if (numplayers > 1)
+ for (int j = 0; j < numplayers; j++) {
+ if (j != i &&
+ !player[j].skeleton.free &&
+ player[j].victim &&
+ player[i].highreversaldelay <= 0) {
+ if (distsq(&player[j].coords, &player[j].victim->coords) < 3 &&
+ player[j].victim == &player[i] &&
+ (player[j].animTarget == spinkickanim) &&
+ player[i].isCrouch()) {
+ if (target >= 0)
+ target = -1;
else
- target=j;
+ target = j;
}
}
}
- if(target>=0)
+ if (target >= 0)
player[target].Reverse();
- player[i].highreversaldelay=.5;
+ player[i].highreversaldelay = .5;
- if(player[i].isCrouch()){
- if(!player[i].wasCrouch()){
- player[i].animCurrent=player[i].getCrouch();
- player[i].frameCurrent=0;
+ if (player[i].isCrouch()) {
+ if (!player[i].wasCrouch()) {
+ player[i].animCurrent = player[i].getCrouch();
+ player[i].frameCurrent = 0;
}
player[i].setAnimation(player[i].getIdle());
- player[i].transspeed=10;
+ player[i].transspeed = 10;
}
}
- if(player[i].animTarget==sneakanim){
+ if (player[i].animTarget == sneakanim) {
player[i].setAnimation(player[i].getIdle());
- player[i].transspeed=10;
+ player[i].transspeed = 10;
}
}
- if(player[i].forwardkeydown){
- if(player[i].isIdle()||
- (player[i].isStop()&&
- player[i].targetyaw==player[i].yaw)||
- (player[i].isLanding()&&
- player[i].frameTarget>0&&
- !player[i].jumpkeydown)||
- (player[i].isLandhard()&&
- player[i].frameTarget>0&&
- !player[i].jumpkeydown&&
- player[i].crouchkeydown)){
- if(player[i].aitype==passivetype)
+ if (player[i].forwardkeydown) {
+ if (player[i].isIdle() ||
+ (player[i].isStop() &&
+ player[i].targetyaw == player[i].yaw) ||
+ (player[i].isLanding() &&
+ player[i].frameTarget > 0 &&
+ !player[i].jumpkeydown) ||
+ (player[i].isLandhard() &&
+ player[i].frameTarget > 0 &&
+ !player[i].jumpkeydown &&
+ player[i].crouchkeydown)) {
+ if (player[i].aitype == passivetype)
player[i].setAnimation(walkanim);
else
player[i].setAnimation(player[i].getRun());
}
- if(player[i].isCrouch()){
- player[i].animTarget=sneakanim;
- if(player[i].wasCrouch())
- player[i].target=0;
- player[i].frameTarget=0;
+ if (player[i].isCrouch()) {
+ player[i].animTarget = sneakanim;
+ if (player[i].wasCrouch())
+ player[i].target = 0;
+ player[i].frameTarget = 0;
}
- if(player[i].animTarget==hanganim/*&&(!player[i].forwardstogglekeydown||player[i].aitype!=playercontrolled)*/){
+ if (player[i].animTarget == hanganim/*&&(!player[i].forwardstogglekeydown||player[i].aitype!=playercontrolled)*/) {
player[i].setAnimation(climbanim);
- player[i].frameTarget=1;
- player[i].jumpclimb=1;
+ player[i].frameTarget = 1;
+ player[i].jumpclimb = 1;
}
- if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip()){
- player[i].velocity+=absflatfacing*5*multiplier;
+ if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) {
+ player[i].velocity += absflatfacing * 5 * multiplier;
}
- player[i].forwardstogglekeydown=1;
- movekey=1;
+ player[i].forwardstogglekeydown = 1;
+ movekey = 1;
}
- if (player[i].rightkeydown){
- if(player[i].isIdle()||
- (player[i].isStop()&&
- player[i].targetyaw==player[i].yaw)||
- (player[i].isLanding()&&
- player[i].frameTarget>0&&
- !player[i].jumpkeydown)||
- (player[i].isLandhard()&&
- player[i].frameTarget>0&&
- !player[i].jumpkeydown&&
- player[i].crouchkeydown)){
+ if (player[i].rightkeydown) {
+ if (player[i].isIdle() ||
+ (player[i].isStop() &&
+ player[i].targetyaw == player[i].yaw) ||
+ (player[i].isLanding() &&
+ player[i].frameTarget > 0 &&
+ !player[i].jumpkeydown) ||
+ (player[i].isLandhard() &&
+ player[i].frameTarget > 0 &&
+ !player[i].jumpkeydown &&
+ player[i].crouchkeydown)) {
player[i].setAnimation(player[i].getRun());
}
- if(player[i].isCrouch()){
- player[i].animTarget=sneakanim;
- if(player[i].wasCrouch())
- player[i].target=0;
- player[i].frameTarget=0;
+ if (player[i].isCrouch()) {
+ player[i].animTarget = sneakanim;
+ if (player[i].wasCrouch())
+ player[i].target = 0;
+ player[i].frameTarget = 0;
}
- if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip()){
- player[i].velocity+=DoRotation(absflatfacing*5*multiplier,0,-90,0);
+ if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) {
+ player[i].velocity += DoRotation(absflatfacing * 5 * multiplier, 0, -90, 0);
}
- player[i].targetyaw-=90;
- if(player[i].forwardkeydown)player[i].targetyaw+=45;
- if(player[i].backkeydown)player[i].targetyaw-=45;
- movekey=1;
+ player[i].targetyaw -= 90;
+ if (player[i].forwardkeydown)player[i].targetyaw += 45;
+ if (player[i].backkeydown)player[i].targetyaw -= 45;
+ movekey = 1;
}
- if ( player[i].leftkeydown){
- if(player[i].isIdle()||
- (player[i].isStop()&&
- player[i].targetyaw==player[i].yaw)||
- (player[i].isLanding()&&
- player[i].frameTarget>0&&
- !player[i].jumpkeydown)||
- (player[i].isLandhard()&&
- player[i].frameTarget>0&&
- !player[i].jumpkeydown&&
- player[i].crouchkeydown)){
+ if ( player[i].leftkeydown) {
+ if (player[i].isIdle() ||
+ (player[i].isStop() &&
+ player[i].targetyaw == player[i].yaw) ||
+ (player[i].isLanding() &&
+ player[i].frameTarget > 0 &&
+ !player[i].jumpkeydown) ||
+ (player[i].isLandhard() &&
+ player[i].frameTarget > 0 &&
+ !player[i].jumpkeydown &&
+ player[i].crouchkeydown)) {
player[i].setAnimation(player[i].getRun());
}
- if(player[i].isCrouch()){
- player[i].animTarget=sneakanim;
- if(player[i].wasCrouch())
- player[i].target=0;
- player[i].frameTarget=0;
+ if (player[i].isCrouch()) {
+ player[i].animTarget = sneakanim;
+ if (player[i].wasCrouch())
+ player[i].target = 0;
+ player[i].frameTarget = 0;
}
- if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip()){
- player[i].velocity-=DoRotation(absflatfacing*5*multiplier,0,-90,0);
+ if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) {
+ player[i].velocity -= DoRotation(absflatfacing * 5 * multiplier, 0, -90, 0);
}
- player[i].targetyaw+=90;
- if(player[i].forwardkeydown)player[i].targetyaw-=45;
- if(player[i].backkeydown)player[i].targetyaw+=45;
- movekey=1;
+ player[i].targetyaw += 90;
+ if (player[i].forwardkeydown)player[i].targetyaw -= 45;
+ if (player[i].backkeydown)player[i].targetyaw += 45;
+ movekey = 1;
}
- if(player[i].backkeydown){
- if(player[i].isIdle()||
- (player[i].isStop()&&
- player[i].targetyaw==player[i].yaw)||
- (player[i].isLanding()&&
- player[i].frameTarget>0&&
- !player[i].jumpkeydown)||
- (player[i].isLandhard()&&
- player[i].frameTarget>0&&
- !player[i].jumpkeydown&&
- player[i].crouchkeydown)){
+ if (player[i].backkeydown) {
+ if (player[i].isIdle() ||
+ (player[i].isStop() &&
+ player[i].targetyaw == player[i].yaw) ||
+ (player[i].isLanding() &&
+ player[i].frameTarget > 0 &&
+ !player[i].jumpkeydown) ||
+ (player[i].isLandhard() &&
+ player[i].frameTarget > 0 &&
+ !player[i].jumpkeydown &&
+ player[i].crouchkeydown)) {
player[i].setAnimation(player[i].getRun());
}
- if(player[i].isCrouch()){
- player[i].animTarget=sneakanim;
- if(player[i].wasCrouch())
- player[i].target=0;
- player[i].frameTarget=0;
+ if (player[i].isCrouch()) {
+ player[i].animTarget = sneakanim;
+ if (player[i].wasCrouch())
+ player[i].target = 0;
+ player[i].frameTarget = 0;
}
- if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip()){
- player[i].velocity-=absflatfacing*5*multiplier;
+ if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) {
+ player[i].velocity -= absflatfacing * 5 * multiplier;
}
- if(player[i].animTarget==hanganim){
- player[i].animCurrent=jumpdownanim;
- player[i].animTarget=jumpdownanim;
- player[i].target=0;
- player[i].frameCurrent=0;
- player[i].frameTarget=1;
- player[i].velocity=0;
- player[i].velocity.y+=gravity;
- player[i].coords.y-=1.4;
- player[i].grabdelay=1;
+ if (player[i].animTarget == hanganim) {
+ player[i].animCurrent = jumpdownanim;
+ player[i].animTarget = jumpdownanim;
+ player[i].target = 0;
+ player[i].frameCurrent = 0;
+ player[i].frameTarget = 1;
+ player[i].velocity = 0;
+ player[i].velocity.y += gravity;
+ player[i].coords.y -= 1.4;
+ player[i].grabdelay = 1;
}
- if ( !player[i].leftkeydown&&!player[i].rightkeydown)
- player[i].targetyaw+=180;
- movekey=1;
+ if ( !player[i].leftkeydown && !player[i].rightkeydown)
+ player[i].targetyaw += 180;
+ movekey = 1;
}
- if((player[i].jumpkeydown&&!player[i].jumpclimb)||player[i].jumpstart){
- if((((player[i].isLanding()&&player[i].frameTarget>=3)||
- player[i].isRun()||
- player[i].animTarget==walkanim||
- player[i].isCrouch()||
- player[i].animTarget==sneakanim)&&
- player[i].jumppower>1)&&
- ((player[i].animTarget!=rabbitrunninganim&&
- player[i].animTarget!=wolfrunninganim)||i!=0)){
- player[i].jumpstart=0;
+ if ((player[i].jumpkeydown && !player[i].jumpclimb) || player[i].jumpstart) {
+ if ((((player[i].isLanding() && player[i].frameTarget >= 3) ||
+ player[i].isRun() ||
+ player[i].animTarget == walkanim ||
+ player[i].isCrouch() ||
+ player[i].animTarget == sneakanim) &&
+ player[i].jumppower > 1) &&
+ ((player[i].animTarget != rabbitrunninganim &&
+ player[i].animTarget != wolfrunninganim) || i != 0)) {
+ player[i].jumpstart = 0;
player[i].setAnimation(jumpupanim);
- player[i].yaw=player[i].targetyaw;
- player[i].transspeed=20;
- player[i].FootLand(0,1);
- player[i].FootLand(1,1);
+ player[i].yaw = player[i].targetyaw;
+ player[i].transspeed = 20;
+ player[i].FootLand(0, 1);
+ player[i].FootLand(1, 1);
- facing=0;
- facing.z=-1;
- flatfacing=DoRotation(facing,0,player[i].targetyaw+180,0);
+ facing = 0;
+ facing.z = -1;
+ flatfacing = DoRotation(facing, 0, player[i].targetyaw + 180, 0);
- if(movekey)player[i].velocity=flatfacing*player[i].speed*45*player[i].scale;
- if(!movekey)player[i].velocity=0;
+ if (movekey)player[i].velocity = flatfacing * player[i].speed * 45 * player[i].scale;
+ if (!movekey)player[i].velocity = 0;
//Dodge sweep?
- target=-2;
- if(numplayers>1)
- for(int j=0;j<numplayers;j++){
- if(j!=i&&!player[j].skeleton.free&&player[j].victim){
- if(distsq(&player[j].coords,&player[j].victim->coords)<3&&
- player[j].victim==&player[i]&&
- (player[j].animTarget==sweepanim)){
- if(target>=0)target=-1;
- else target=j;
+ target = -2;
+ if (numplayers > 1)
+ for (int j = 0; j < numplayers; j++) {
+ if (j != i && !player[j].skeleton.free && player[j].victim) {
+ if (distsq(&player[j].coords, &player[j].victim->coords) < 3 &&
+ player[j].victim == &player[i] &&
+ (player[j].animTarget == sweepanim)) {
+ if (target >= 0)target = -1;
+ else target = j;
}
}
}
- if(target>=0)player[i].velocity.y=1;
- else if(player[i].crouchkeydown||player[i].aitype!=playercontrolled){
- player[i].velocity.y=7;
- player[i].crouchtogglekeydown=1;
- }
- else player[i].velocity.y=5;
-
- if(mousejump&&i==0&&debugmode){
- if(!player[i].isLanding())player[i].tempdeltav=deltav;
- if(player[i].tempdeltav<0)player[i].velocity.y-=(float)(player[i].tempdeltav)/multiplier/1000;
- }
+ if (target >= 0)player[i].velocity.y = 1;
+ else if (player[i].crouchkeydown || player[i].aitype != playercontrolled) {
+ player[i].velocity.y = 7;
+ player[i].crouchtogglekeydown = 1;
+ } else player[i].velocity.y = 5;
+
+ if (mousejump && i == 0 && debugmode) {
+ if (!player[i].isLanding())player[i].tempdeltav = deltav;
+ if (player[i].tempdeltav < 0)player[i].velocity.y -= (float)(player[i].tempdeltav) / multiplier / 1000;
+ }
- player[i].coords.y+=.2;
- player[i].jumppower-=1;
+ player[i].coords.y += .2;
+ player[i].jumppower -= 1;
- if (!i)
- emit_sound_at(whooshsound, player[i].coords, 128.);
+ if (!i)
+ emit_sound_at(whooshsound, player[i].coords, 128.);
- emit_sound_at(jumpsound, player[i].coords, 128.);
+ emit_sound_at(jumpsound, player[i].coords, 128.);
}
- if((player[i].isIdle())&&player[i].jumppower>1){
+ if ((player[i].isIdle()) && player[i].jumppower > 1) {
player[i].setAnimation(player[i].getLanding());
- player[i].frameTarget=2;
- player[i].landhard=0;
- player[i].jumpstart=1;
- player[i].tempdeltav=deltav;
+ player[i].frameTarget = 2;
+ player[i].landhard = 0;
+ player[i].jumpstart = 1;
+ player[i].tempdeltav = deltav;
}
- if(player[i].animTarget==jumpupanim&&
- (((!floatjump&&
- !editorenabled)||
- !debugmode)||
- player[i].aitype!=playercontrolled)){
- if(player[i].jumppower>multiplier*6){
- player[i].velocity.y+=multiplier*6;
- player[i].jumppower-=multiplier*6;
+ if (player[i].animTarget == jumpupanim &&
+ (((!floatjump &&
+ !editorenabled) ||
+ !debugmode) ||
+ player[i].aitype != playercontrolled)) {
+ if (player[i].jumppower > multiplier * 6) {
+ player[i].velocity.y += multiplier * 6;
+ player[i].jumppower -= multiplier * 6;
}
- if(player[i].jumppower<=multiplier*6){
- player[i].velocity.y+=player[i].jumppower;
- player[i].jumppower=0;
+ if (player[i].jumppower <= multiplier * 6) {
+ player[i].velocity.y += player[i].jumppower;
+ player[i].jumppower = 0;
}
}
- if(((floatjump||editorenabled)&&debugmode)&&i==0)player[i].velocity.y+=multiplier*30;
+ if (((floatjump || editorenabled) && debugmode) && i == 0)player[i].velocity.y += multiplier * 30;
}
- if(!movekey){
- if(player[i].isRun()||player[i].animTarget==walkanim)
+ if (!movekey) {
+ if (player[i].isRun() || player[i].animTarget == walkanim)
player[i].setAnimation(player[i].getStop());
- if(player[i].animTarget==sneakanim){
- player[i].animTarget=player[i].getCrouch();
- if(player[i].animCurrent==sneakanim)
- player[i].target=0;
- player[i].frameTarget=0;
+ if (player[i].animTarget == sneakanim) {
+ player[i].animTarget = player[i].getCrouch();
+ if (player[i].animCurrent == sneakanim)
+ player[i].target = 0;
+ player[i].frameTarget = 0;
}
}
- if(player[i].animTarget==walkanim&&
- (player[i].aitype==attacktypecutoff||
- player[i].aitype==searchtype||
- (player[i].aitype==passivetype&&
- player[i].numwaypoints<=1)))
+ if (player[i].animTarget == walkanim &&
+ (player[i].aitype == attacktypecutoff ||
+ player[i].aitype == searchtype ||
+ (player[i].aitype == passivetype &&
+ player[i].numwaypoints <= 1)))
player[i].setAnimation(player[i].getStop());
- if(player[i].isRun()&&(player[i].aitype==passivetype))
+ if (player[i].isRun() && (player[i].aitype == passivetype))
player[i].setAnimation(player[i].getStop());
}
}
- if(player[i].animTarget==rollanim)
- player[i].targetyaw=oldtargetyaw;
+ if (player[i].animTarget == rollanim)
+ player[i].targetyaw = oldtargetyaw;
}
//Rotation
- for(int k=0;k<numplayers;k++){
- if(fabs(player[k].yaw-player[k].targetyaw)>180){
- if(player[k].yaw>player[k].targetyaw)
- player[k].yaw-=360;
+ for (int k = 0; k < numplayers; k++) {
+ if (fabs(player[k].yaw - player[k].targetyaw) > 180) {
+ if (player[k].yaw > player[k].targetyaw)
+ player[k].yaw -= 360;
else
- player[k].yaw+=360;
+ player[k].yaw += 360;
}
//stop to turn in right direction
- if(fabs(player[k].yaw-player[k].targetyaw)>90&&(player[k].isRun()||player[k].animTarget==walkanim))
+ if (fabs(player[k].yaw - player[k].targetyaw) > 90 && (player[k].isRun() || player[k].animTarget == walkanim))
player[k].setAnimation(player[k].getStop());
- if(player[k].animTarget==backhandspringanim||player[k].animTarget==dodgebackanim)
- player[k].targettilt=0;
-
- if(player[k].animTarget!=jumpupanim&&
- player[k].animTarget!=backhandspringanim&&
- player[k].animTarget!=jumpdownanim&&
- !player[k].isFlip()){
- player[k].targettilt=0;
- if(player[k].jumppower<0&&!player[k].jumpkeydown)
- player[k].jumppower=0;
- player[k].jumppower+=multiplier*7;
- if(player[k].isCrouch())
- player[k].jumppower+=multiplier*7;
- if(player[k].jumppower>5)
- player[k].jumppower=5;
+ if (player[k].animTarget == backhandspringanim || player[k].animTarget == dodgebackanim)
+ player[k].targettilt = 0;
+
+ if (player[k].animTarget != jumpupanim &&
+ player[k].animTarget != backhandspringanim &&
+ player[k].animTarget != jumpdownanim &&
+ !player[k].isFlip()) {
+ player[k].targettilt = 0;
+ if (player[k].jumppower < 0 && !player[k].jumpkeydown)
+ player[k].jumppower = 0;
+ player[k].jumppower += multiplier * 7;
+ if (player[k].isCrouch())
+ player[k].jumppower += multiplier * 7;
+ if (player[k].jumppower > 5)
+ player[k].jumppower = 5;
}
- if(player[k].isRun())
- player[k].targettilt=(player[k].yaw-player[k].targetyaw)/4;
+ if (player[k].isRun())
+ player[k].targettilt = (player[k].yaw - player[k].targetyaw) / 4;
- player[k].tilt=stepTowardf(player[k].tilt,player[k].targettilt,multiplier*150);
- player[k].grabdelay-=multiplier;
+ player[k].tilt = stepTowardf(player[k].tilt, player[k].targettilt, multiplier * 150);
+ player[k].grabdelay -= multiplier;
}
//do animations
- for(int k=0;k<numplayers;k++){
+ for (int k = 0; k < numplayers; k++) {
player[k].DoAnimations();
- player[k].whichpatchx=player[k].coords.x/(terrain.size/subdivision*terrain.scale);
- player[k].whichpatchz=player[k].coords.z/(terrain.size/subdivision*terrain.scale);
+ player[k].whichpatchx = player[k].coords.x / (terrain.size / subdivision * terrain.scale);
+ player[k].whichpatchz = player[k].coords.z / (terrain.size / subdivision * terrain.scale);
}
//do stuff
objects.DoStuff();
-
- for(int j=numenvsounds-1;j>=0;j--){
- envsoundlife[j]-=multiplier;
- if(envsoundlife[j]<0){
+
+ for (int j = numenvsounds - 1; j >= 0; j--) {
+ envsoundlife[j] -= multiplier;
+ if (envsoundlife[j] < 0) {
numenvsounds--;
- envsoundlife[j]=envsoundlife[numenvsounds];
- envsound[j]=envsound[numenvsounds];
+ envsoundlife[j] = envsoundlife[numenvsounds];
+ envsound[j] = envsound[numenvsounds];
}
}
- if(slomo)
+ if (slomo)
OPENAL_SetFrequency(OPENAL_ALL, slomofreq);
else
OPENAL_SetFrequency(OPENAL_ALL, 22050);
- if(tutoriallevel==1){
+ if (tutoriallevel == 1) {
XYZ temp;
XYZ temp2;
XYZ temp3;
XYZ oldtemp;
XYZ oldtemp2;
- temp.x=1011;
- temp.y=84;
- temp.z=491;
- temp2.x=1025;
- temp2.y=75;
- temp2.z=447;
- temp3.x=1038;
- temp3.y=76;
- temp3.z=453;
- oldtemp=temp;
- oldtemp2=temp2;
- if(tutorialstage>=51)
- if(distsq(&temp,&player[0].coords)>=distsq(&temp,&temp2)-1||distsq(&temp3,&player[0].coords)<4){
+ temp.x = 1011;
+ temp.y = 84;
+ temp.z = 491;
+ temp2.x = 1025;
+ temp2.y = 75;
+ temp2.z = 447;
+ temp3.x = 1038;
+ temp3.y = 76;
+ temp3.z = 453;
+ oldtemp = temp;
+ oldtemp2 = temp2;
+ if (tutorialstage >= 51)
+ if (distsq(&temp, &player[0].coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &player[0].coords) < 4) {
OPENAL_StopSound(OPENAL_ALL); // hack...OpenAL renderer isn't stopping music after tutorial goes to level menu...
OPENAL_SetFrequency(OPENAL_ALL, 0.001);
emit_stream_np(stream_menutheme);
- gameon=0;
- mainmenu=5;
+ gameon = 0;
+ mainmenu = 5;
fireSound();
flash();
}
- if(tutorialstage<51)
- if(distsq(&temp,&player[0].coords)>=distsq(&temp,&temp2)-1||distsq(&temp3,&player[0].coords)<4){
+ if (tutorialstage < 51)
+ if (distsq(&temp, &player[0].coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &player[0].coords) < 4) {
emit_sound_at(fireendsound, player[0].coords);
- player[0].coords=(oldtemp+oldtemp2)/2;
+ player[0].coords = (oldtemp + oldtemp2) / 2;
flash();
}
- if(tutorialstage>=14&&tutorialstage<50)
- if(distsq(&temp,&player[1].coords)>=distsq(&temp,&temp2)-1||distsq(&temp3,&player[1].coords)<4){
+ if (tutorialstage >= 14 && tutorialstage < 50)
+ if (distsq(&temp, &player[1].coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &player[1].coords) < 4) {
emit_sound_at(fireendsound, player[1].coords);
- for(int i=0;i<player[1].skeleton.num_joints;i++){
- if(Random()%2==0){
- if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
- if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
- if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].yaw,0)*player[1].scale+player[1].coords;
- if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
- Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
+ for (int i = 0; i < player[1].skeleton.num_joints; i++) {
+ if (Random() % 2 == 0) {
+ if (!player[1].skeleton.free)temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
+ if (player[1].skeleton.free)temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
+ if (!player[1].skeleton.free)temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
+ if (player[1].skeleton.free)temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
+ Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
}
}
- player[1].coords=(oldtemp+oldtemp2)/2;
- for(int i=0;i<player[1].skeleton.num_joints;i++){
- player[1].skeleton.joints[i].velocity=0;
- if(Random()%2==0){
- if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
- if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
- if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].yaw,0)*player[1].scale+player[1].coords;
- if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
- Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
+ player[1].coords = (oldtemp + oldtemp2) / 2;
+ for (int i = 0; i < player[1].skeleton.num_joints; i++) {
+ player[1].skeleton.joints[i].velocity = 0;
+ if (Random() % 2 == 0) {
+ if (!player[1].skeleton.free)temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
+ if (player[1].skeleton.free)temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
+ if (!player[1].skeleton.free)temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
+ if (player[1].skeleton.free)temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
+ Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
}
}
}
//3d sound
static float gLoc[3];
- gLoc[0]=viewer.x;
- gLoc[1]=viewer.y;
- gLoc[2]=viewer.z;
+ gLoc[0] = viewer.x;
+ gLoc[1] = viewer.y;
+ gLoc[2] = viewer.z;
static float vel[3];
- vel[0]=(viewer.x-oldviewer.x)/multiplier;
- vel[1]=(viewer.y-oldviewer.y)/multiplier;
- vel[2]=(viewer.z-oldviewer.z)/multiplier;
+ vel[0] = (viewer.x - oldviewer.x) / multiplier;
+ vel[1] = (viewer.y - oldviewer.y) / multiplier;
+ vel[2] = (viewer.z - oldviewer.z) / multiplier;
//Set orientation with forward and up vectors
static XYZ upvector;
- upvector=0;
- upvector.z=-1;
+ upvector = 0;
+ upvector.z = -1;
- upvector=DoRotation(upvector,-pitch+90,0,0);
- upvector=DoRotation(upvector,0,0-yaw,0);
+ upvector = DoRotation(upvector, -pitch + 90, 0, 0);
+ upvector = DoRotation(upvector, 0, 0 - yaw, 0);
- facing=0;
- facing.z=-1;
+ facing = 0;
+ facing.z = -1;
- facing=DoRotation(facing,-pitch,0,0);
- facing=DoRotation(facing,0,0-yaw,0);
+ facing = DoRotation(facing, -pitch, 0, 0);
+ facing = DoRotation(facing, 0, 0 - yaw, 0);
static float ori[6];
OPENAL_3D_Listener_SetAttributes(&gLoc[0], &vel[0], ori[0], ori[1], ori[2], ori[3], ori[4], ori[5]);
OPENAL_Update();
- oldviewer=viewer;
- }
- }
+ oldviewer = viewer;
+ }
+ }
- if(Input::isKeyPressed(SDLK_F1))
- Screenshot();
+ if (Input::isKeyPressed(SDLK_F1))
+ Screenshot();
}
-void Game::TickOnce(){
- if(mainmenu)
- yaw+=multiplier*5;
- else
- if(directing||indialogue==-1) {
- yaw+=deltah*.7;
- if(!invertmouse)
- pitch+=deltav*.7;
- if(invertmouse)
- pitch-=deltav*.7;
- if(pitch>90)
- pitch=90;
- if(pitch<-70)
- pitch=-70;
- }
+void Game::TickOnce()
+{
+ if (mainmenu)
+ yaw += multiplier * 5;
+ else if (directing || indialogue == -1) {
+ yaw += deltah * .7;
+ if (!invertmouse)
+ pitch += deltav * .7;
+ if (invertmouse)
+ pitch -= deltav * .7;
+ if (pitch > 90)
+ pitch = 90;
+ if (pitch < -70)
+ pitch = -70;
+ }
}
-void Game::TickOnceAfter(){
- static XYZ colviewer;
- static XYZ coltarget;
- static XYZ target;
- static XYZ col;
- static XYZ facing;
- static float changedelay;
- static bool alldead;
- static float unseendelay;
- static float cameraspeed;
-
- if(!mainmenu){
- static int oldmusictype=musictype;
-
- if(environment==snowyenvironment)
- leveltheme=stream_snowtheme;
- if(environment==grassyenvironment)
- leveltheme=stream_grasstheme;
- if(environment==desertenvironment)
- leveltheme=stream_deserttheme;
-
- realthreat=0;
-
- musictype=leveltheme;
- for(int i=0;i<numplayers;i++){
- if((player[i].aitype==attacktypecutoff||
- player[i].aitype==getweapontype||
- player[i].aitype==gethelptype||
- player[i].aitype==searchtype)&&
- !player[i].dead/*&&player[i].surprised<=0*/&&
- (player[i].animTarget!=sneakattackedanim&&
- player[i].animTarget!=knifesneakattackedanim&&
- player[i].animTarget!=swordsneakattackedanim)){
- musictype=stream_fighttheme;
- realthreat=1;
- }
- }
- if(player[0].dead)
- musictype=stream_menutheme;
-
-
- if(musictype==stream_fighttheme)
- unseendelay=1;
-
- if(oldmusictype==stream_fighttheme&&musictype!=stream_fighttheme){
- unseendelay-=multiplier;
- if(unseendelay>0)
- musictype=stream_fighttheme;
- }
-
-
- if(loading==2){
- musictype=stream_menutheme;
- musicvolume[2]=512;
- musicvolume[0]=0;
- musicvolume[1]=0;
- musicvolume[3]=0;
- }
-
- if(musictoggle)
- if(musictype!=oldmusictype&&musictype==stream_fighttheme)
- emit_sound_np(alarmsound);
- musicselected=musictype;
-
- if(musicselected==leveltheme)
- musicvolume[0]+=multiplier*450;
- else
- musicvolume[0]-=multiplier*450;
- if(musicselected==stream_fighttheme)
- musicvolume[1]+=multiplier*450;
- else
- musicvolume[1]-=multiplier*450;
- if(musicselected==stream_menutheme)
- musicvolume[2]+=multiplier*450;
- else
- musicvolume[2]-=multiplier*450;
-
- for(int i=0;i<3;i++){
- if(musicvolume[i]<0)
- musicvolume[i]=0;
- if(musicvolume[i]>512)
- musicvolume[i]=512;
- }
-
- if(musicvolume[2]>128&&!loading&&!mainmenu)
- musicvolume[2]=128;
-
- if(musictoggle){
- if(musicvolume[0]>0&&oldmusicvolume[0]<=0)
- emit_stream_np(leveltheme, musicvolume[0]);
- if(musicvolume[1]>0&&oldmusicvolume[1]<=0)
- emit_stream_np(stream_fighttheme, musicvolume[1]);
- if(musicvolume[2]>0&&oldmusicvolume[2]<=0)
- emit_stream_np(stream_menutheme, musicvolume[2]);
- if(musicvolume[0]<=0&&oldmusicvolume[0]>0)
- pause_sound(leveltheme);
- if(musicvolume[1]<=0&&oldmusicvolume[1]>0)
- pause_sound(stream_fighttheme);
- if(musicvolume[2]<=0&&oldmusicvolume[2]>0)
- pause_sound(stream_menutheme);
-
- if(musicvolume[0]!=oldmusicvolume[0])
- OPENAL_SetVolume(channels[leveltheme], musicvolume[0]);
- if(musicvolume[1]!=oldmusicvolume[1])
- OPENAL_SetVolume(channels[stream_fighttheme], musicvolume[1]);
- if(musicvolume[2]!=oldmusicvolume[2])
- OPENAL_SetVolume(channels[stream_menutheme], musicvolume[2]);
-
- for(int i=0;i<3;i++)
- oldmusicvolume[i]=musicvolume[i];
- } else {
- pause_sound(leveltheme);
- pause_sound(stream_fighttheme);
- pause_sound(stream_menutheme);
-
- for(int i=0;i<4;i++){
- oldmusicvolume[i]=0;
- musicvolume[i]=0;
- }
- }
-
- killhotspot=2;
- for(int i=0;i<numhotspots;i++){
- if(hotspottype[i]>10&&hotspottype[i]<20){
- if(player[hotspottype[i]-10].dead==0)
- killhotspot=0;
- else if(killhotspot==2)
- killhotspot=1;
- }
- }
- if(killhotspot==2)
- killhotspot=0;
-
-
- winhotspot=false;
- for(int i=0;i<numhotspots;i++)
- if(hotspottype[i]==-1)
- if(distsq(&player[0].coords,&hotspot[i])<hotspotsize[i])
- winhotspot=true;
-
- int numalarmed=0;
- for(int i=1;i<numplayers;i++)
- if(!player[i].dead&&player[i].aitype==attacktypecutoff&&player[i].surprised<=0)
+void Game::TickOnceAfter()
+{
+ static XYZ colviewer;
+ static XYZ coltarget;
+ static XYZ target;
+ static XYZ col;
+ static XYZ facing;
+ static float changedelay;
+ static bool alldead;
+ static float unseendelay;
+ static float cameraspeed;
+
+ if (!mainmenu) {
+ static int oldmusictype = musictype;
+
+ if (environment == snowyenvironment)
+ leveltheme = stream_snowtheme;
+ if (environment == grassyenvironment)
+ leveltheme = stream_grasstheme;
+ if (environment == desertenvironment)
+ leveltheme = stream_deserttheme;
+
+ realthreat = 0;
+
+ musictype = leveltheme;
+ for (int i = 0; i < numplayers; i++) {
+ if ((player[i].aitype == attacktypecutoff ||
+ player[i].aitype == getweapontype ||
+ player[i].aitype == gethelptype ||
+ player[i].aitype == searchtype) &&
+ !player[i].dead/*&&player[i].surprised<=0*/ &&
+ (player[i].animTarget != sneakattackedanim &&
+ player[i].animTarget != knifesneakattackedanim &&
+ player[i].animTarget != swordsneakattackedanim)) {
+ musictype = stream_fighttheme;
+ realthreat = 1;
+ }
+ }
+ if (player[0].dead)
+ musictype = stream_menutheme;
+
+
+ if (musictype == stream_fighttheme)
+ unseendelay = 1;
+
+ if (oldmusictype == stream_fighttheme && musictype != stream_fighttheme) {
+ unseendelay -= multiplier;
+ if (unseendelay > 0)
+ musictype = stream_fighttheme;
+ }
+
+
+ if (loading == 2) {
+ musictype = stream_menutheme;
+ musicvolume[2] = 512;
+ musicvolume[0] = 0;
+ musicvolume[1] = 0;
+ musicvolume[3] = 0;
+ }
+
+ if (musictoggle)
+ if (musictype != oldmusictype && musictype == stream_fighttheme)
+ emit_sound_np(alarmsound);
+ musicselected = musictype;
+
+ if (musicselected == leveltheme)
+ musicvolume[0] += multiplier * 450;
+ else
+ musicvolume[0] -= multiplier * 450;
+ if (musicselected == stream_fighttheme)
+ musicvolume[1] += multiplier * 450;
+ else
+ musicvolume[1] -= multiplier * 450;
+ if (musicselected == stream_menutheme)
+ musicvolume[2] += multiplier * 450;
+ else
+ musicvolume[2] -= multiplier * 450;
+
+ for (int i = 0; i < 3; i++) {
+ if (musicvolume[i] < 0)
+ musicvolume[i] = 0;
+ if (musicvolume[i] > 512)
+ musicvolume[i] = 512;
+ }
+
+ if (musicvolume[2] > 128 && !loading && !mainmenu)
+ musicvolume[2] = 128;
+
+ if (musictoggle) {
+ if (musicvolume[0] > 0 && oldmusicvolume[0] <= 0)
+ emit_stream_np(leveltheme, musicvolume[0]);
+ if (musicvolume[1] > 0 && oldmusicvolume[1] <= 0)
+ emit_stream_np(stream_fighttheme, musicvolume[1]);
+ if (musicvolume[2] > 0 && oldmusicvolume[2] <= 0)
+ emit_stream_np(stream_menutheme, musicvolume[2]);
+ if (musicvolume[0] <= 0 && oldmusicvolume[0] > 0)
+ pause_sound(leveltheme);
+ if (musicvolume[1] <= 0 && oldmusicvolume[1] > 0)
+ pause_sound(stream_fighttheme);
+ if (musicvolume[2] <= 0 && oldmusicvolume[2] > 0)
+ pause_sound(stream_menutheme);
+
+ if (musicvolume[0] != oldmusicvolume[0])
+ OPENAL_SetVolume(channels[leveltheme], musicvolume[0]);
+ if (musicvolume[1] != oldmusicvolume[1])
+ OPENAL_SetVolume(channels[stream_fighttheme], musicvolume[1]);
+ if (musicvolume[2] != oldmusicvolume[2])
+ OPENAL_SetVolume(channels[stream_menutheme], musicvolume[2]);
+
+ for (int i = 0; i < 3; i++)
+ oldmusicvolume[i] = musicvolume[i];
+ } else {
+ pause_sound(leveltheme);
+ pause_sound(stream_fighttheme);
+ pause_sound(stream_menutheme);
+
+ for (int i = 0; i < 4; i++) {
+ oldmusicvolume[i] = 0;
+ musicvolume[i] = 0;
+ }
+ }
+
+ killhotspot = 2;
+ for (int i = 0; i < numhotspots; i++) {
+ if (hotspottype[i] > 10 && hotspottype[i] < 20) {
+ if (player[hotspottype[i] - 10].dead == 0)
+ killhotspot = 0;
+ else if (killhotspot == 2)
+ killhotspot = 1;
+ }
+ }
+ if (killhotspot == 2)
+ killhotspot = 0;
+
+
+ winhotspot = false;
+ for (int i = 0; i < numhotspots; i++)
+ if (hotspottype[i] == -1)
+ if (distsq(&player[0].coords, &hotspot[i]) < hotspotsize[i])
+ winhotspot = true;
+
+ int numalarmed = 0;
+ for (int i = 1; i < numplayers; i++)
+ if (!player[i].dead && player[i].aitype == attacktypecutoff && player[i].surprised <= 0)
numalarmed++;
- if(numalarmed>maxalarmed)
- maxalarmed=numalarmed;
-
- if(changedelay<=0&&!loading&&!editorenabled&&gameon&&!tutoriallevel&&changedelay!=-999&&!won){
- if(player[0].dead&&changedelay<=0){
- changedelay=1;
- targetlevel=whichlevel;
- }
- alldead=true;
- for(int i=1;i<numplayers;i++) {
- if(!player[i].dead&&player[i].howactive<typedead1) {
- alldead=false;
+ if (numalarmed > maxalarmed)
+ maxalarmed = numalarmed;
+
+ if (changedelay <= 0 && !loading && !editorenabled && gameon && !tutoriallevel && changedelay != -999 && !won) {
+ if (player[0].dead && changedelay <= 0) {
+ changedelay = 1;
+ targetlevel = whichlevel;
+ }
+ alldead = true;
+ for (int i = 1; i < numplayers; i++) {
+ if (!player[i].dead && player[i].howactive < typedead1) {
+ alldead = false;
break;
- }
- }
-
-
- if(alldead&&!player[0].dead&&maptype==mapkilleveryone) {
- changedelay=1;
- targetlevel=whichlevel+1;
- if(targetlevel>numchallengelevels-1)targetlevel=0;
- }
- if(winhotspot||windialogue) {
- changedelay=0.1;
- targetlevel=whichlevel+1;
- if(targetlevel>numchallengelevels-1)targetlevel=0;
- }
-
-
- if(killhotspot){
- changedelay=1;
- targetlevel=whichlevel+1;
- if(targetlevel>numchallengelevels-1)targetlevel=0;
- }
-
- if(changedelay>0&&!player[0].dead&&!won) {
- //high scores, awards, win
- if(campaign) {
- accountactive->winCampaignLevel(whichchoice, bonustotal, leveltime);
- scoreadded=1;
- } else {
- accountactive->winLevel(whichlevel,bonustotal-startbonustotal,leveltime);
- }
- won=1;
- }
- }
-
- if(!winfreeze){
-
- if(leveltime<1){
- loading=0;
- changedelay=.1;
- alldead=false;
- winhotspot=false;
- killhotspot=0;
- }
-
- if(!editorenabled&&gameon&&!mainmenu) {
- if(changedelay!=-999)
- changedelay-=multiplier/7;
- if(player[0].dead)
- targetlevel=whichlevel;
- if(loading==2&&!campaign){
- flash();
-
- fireSound(firestartsound);
-
- if(!player[0].dead&&targetlevel!=whichlevel)
- startbonustotal=bonustotal;
- if(player[0].dead)
+ }
+ }
+
+
+ if (alldead && !player[0].dead && maptype == mapkilleveryone) {
+ changedelay = 1;
+ targetlevel = whichlevel + 1;
+ if (targetlevel > numchallengelevels - 1)targetlevel = 0;
+ }
+ if (winhotspot || windialogue) {
+ changedelay = 0.1;
+ targetlevel = whichlevel + 1;
+ if (targetlevel > numchallengelevels - 1)targetlevel = 0;
+ }
+
+
+ if (killhotspot) {
+ changedelay = 1;
+ targetlevel = whichlevel + 1;
+ if (targetlevel > numchallengelevels - 1)targetlevel = 0;
+ }
+
+ if (changedelay > 0 && !player[0].dead && !won) {
+ //high scores, awards, win
+ if (campaign) {
+ accountactive->winCampaignLevel(whichchoice, bonustotal, leveltime);
+ scoreadded = 1;
+ } else {
+ accountactive->winLevel(whichlevel, bonustotal - startbonustotal, leveltime);
+ }
+ won = 1;
+ }
+ }
+
+ if (!winfreeze) {
+
+ if (leveltime < 1) {
+ loading = 0;
+ changedelay = .1;
+ alldead = false;
+ winhotspot = false;
+ killhotspot = 0;
+ }
+
+ if (!editorenabled && gameon && !mainmenu) {
+ if (changedelay != -999)
+ changedelay -= multiplier / 7;
+ if (player[0].dead)
+ targetlevel = whichlevel;
+ if (loading == 2 && !campaign) {
+ flash();
+
+ fireSound(firestartsound);
+
+ if (!player[0].dead && targetlevel != whichlevel)
+ startbonustotal = bonustotal;
+ if (player[0].dead)
Loadlevel(whichlevel);
- else
+ else
Loadlevel(targetlevel);
- fireSound();
+ fireSound();
- loading=3;
- }
- if(loading==2&&targetlevel==whichlevel){
- flash();
- loadtime=0;
+ loading = 3;
+ }
+ if (loading == 2 && targetlevel == whichlevel) {
+ flash();
+ loadtime = 0;
- fireSound(firestartsound);
+ fireSound(firestartsound);
- Loadlevel(campaignlevels[accountactive->getCampaignChoicesMade()].mapname.c_str());
+ Loadlevel(campaignlevels[accountactive->getCampaignChoicesMade()].mapname.c_str());
- fireSound();
+ fireSound();
- loading=3;
- }
- if(changedelay<=-999&&
- whichlevel!=-2&&
- !loading&&
- (player[0].dead||
- (alldead&&maptype==mapkilleveryone)||
- (winhotspot)||
+ loading = 3;
+ }
+ if (changedelay <= -999 &&
+ whichlevel != -2 &&
+ !loading &&
+ (player[0].dead ||
+ (alldead && maptype == mapkilleveryone) ||
+ (winhotspot) ||
(killhotspot)))
- loading=1;
- if((player[0].dead||
- (alldead&&maptype==mapkilleveryone)||
- (winhotspot)||
- (windialogue)||
- (killhotspot))&&
- changedelay<=0) {
- if(whichlevel!=-2&&!loading&&!player[0].dead) {
- winfreeze=true;
- changedelay=-999;
+ loading = 1;
+ if ((player[0].dead ||
+ (alldead && maptype == mapkilleveryone) ||
+ (winhotspot) ||
+ (windialogue) ||
+ (killhotspot)) &&
+ changedelay <= 0) {
+ if (whichlevel != -2 && !loading && !player[0].dead) {
+ winfreeze = true;
+ changedelay = -999;
}
- if(player[0].dead)
- loading=1;
- }
- }
+ if (player[0].dead)
+ loading = 1;
+ }
+ }
- if(campaign) {
+ if (campaign) {
// campaignchoosenext determines what to do when the level is complete:
// 0 = load next level
// 1 = go back to level select screen
// 2 = stealthload next level
- if(mainmenu==0&&winfreeze&&(campaignlevels[actuallevel].choosenext)==1) {
- if(campaignlevels[actuallevel].nextlevel.empty())
- endgame=1;
- } else if(mainmenu==0&&winfreeze) {
- stealthloading = (campaignlevels[actuallevel].choosenext==2);
+ if (mainmenu == 0 && winfreeze && (campaignlevels[actuallevel].choosenext) == 1) {
+ if (campaignlevels[actuallevel].nextlevel.empty())
+ endgame = 1;
+ } else if (mainmenu == 0 && winfreeze) {
+ stealthloading = (campaignlevels[actuallevel].choosenext == 2);
- if(!stealthloading){
- fireSound(firestartsound);
+ if (!stealthloading) {
+ fireSound(firestartsound);
- flash();
- }
-
- startbonustotal=0;
-
- LoadCampaign();
-
- loading=2;
- loadtime=0;
- targetlevel=7;
- if(!firstload)
- LoadStuff();
- whichchoice=0;
- actuallevel=campaignlevels[actuallevel].nextlevel.front();
- visibleloading=1;
- stillloading=1;
- Loadlevel(campaignlevels[actuallevel].mapname.c_str());
- campaign=1;
- mainmenu=0;
- gameon=1;
- pause_sound(stream_menutheme);
+ flash();
+ }
- stealthloading=0;
- }
+ startbonustotal = 0;
+
+ LoadCampaign();
+
+ loading = 2;
+ loadtime = 0;
+ targetlevel = 7;
+ if (!firstload)
+ LoadStuff();
+ whichchoice = 0;
+ actuallevel = campaignlevels[actuallevel].nextlevel.front();
+ visibleloading = 1;
+ stillloading = 1;
+ Loadlevel(campaignlevels[actuallevel].mapname.c_str());
+ campaign = 1;
+ mainmenu = 0;
+ gameon = 1;
+ pause_sound(stream_menutheme);
+
+ stealthloading = 0;
+ }
}
- if(loading==3)
- loading=0;
+ if (loading == 3)
+ loading = 0;
}
- oldmusictype=musictype;
- }
-
- facing=0;
- facing.z=-1;
-
- facing=DoRotation(facing,-pitch,0,0);
- facing=DoRotation(facing,0,0-yaw,0);
- viewerfacing=facing;
-
- if(!cameramode){
- if((animation[player[0].animTarget].attack!=3&&animation[player[0].animCurrent].attack!=3)||player[0].skeleton.free)target=player[0].coords+player[0].currentoffset*(1-player[0].target)*player[0].scale+player[0].targetoffset*player[0].target*player[0].scale-player[0].facing*.05;
- else target=player[0].oldcoords+player[0].currentoffset*(1-player[0].target)*player[0].scale+player[0].targetoffset*player[0].target*player[0].scale-player[0].facing*.05;
- target.y+=.1;
- if(player[0].skeleton.free){
- for(int i=0;i<player[0].skeleton.num_joints;i++){
- if(player[0].skeleton.joints[i].position.y*player[0].scale+player[0].coords.y>target.y)
- target.y=player[0].skeleton.joints[i].position.y*player[0].scale+player[0].coords.y;
- }
- target.y+=.1;
- }
- if(player[0].skeleton.free!=2/*&&!autocam*/){
- cameraspeed=20;
- if(findLengthfast(&player[0].velocity)>400){
- cameraspeed=20+(findLength(&player[0].velocity)-20)*.96;
- }
- if(player[0].skeleton.free==0&&player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim)target.y+=1.4;
- coltarget=target-cameraloc;
- if(findLengthfast(&coltarget)<multiplier*multiplier*400)cameraloc=target;
- else {
- Normalise(&coltarget);
- if(player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim&&player[0].animCurrent!=climbanim&&player[0].currentoffset.x==0)cameraloc=cameraloc+coltarget*multiplier*cameraspeed;
- else cameraloc=cameraloc+coltarget*multiplier*8;
- }
- if(editorenabled)cameraloc=target;
- cameradist+=multiplier*5;
- if(cameradist>2.3)cameradist=2.3;
- viewer=cameraloc-facing*cameradist;
- colviewer=viewer;
- coltarget=cameraloc;
- objects.SphereCheckPossible(&colviewer, findDistance(&colviewer,&coltarget));
- if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
- for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
- int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
- colviewer=viewer;
- coltarget=cameraloc;
- if(objects.model[i].LineCheckPossible(&colviewer,&coltarget,&col,&objects.position[i],&objects.yaw[i])!=-1)viewer=col;
- }
- if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
- for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
- int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
- colviewer=viewer;
- if(objects.model[i].SphereCheck(&colviewer,.15,&col,&objects.position[i],&objects.yaw[i])!=-1){
- viewer=colviewer;
+ oldmusictype = musictype;
+ }
+
+ facing = 0;
+ facing.z = -1;
+
+ facing = DoRotation(facing, -pitch, 0, 0);
+ facing = DoRotation(facing, 0, 0 - yaw, 0);
+ viewerfacing = facing;
+
+ if (!cameramode) {
+ if ((animation[player[0].animTarget].attack != 3 && animation[player[0].animCurrent].attack != 3) || player[0].skeleton.free)target = player[0].coords + player[0].currentoffset * (1 - player[0].target) * player[0].scale + player[0].targetoffset * player[0].target * player[0].scale - player[0].facing * .05;
+ else target = player[0].oldcoords + player[0].currentoffset * (1 - player[0].target) * player[0].scale + player[0].targetoffset * player[0].target * player[0].scale - player[0].facing * .05;
+ target.y += .1;
+ if (player[0].skeleton.free) {
+ for (int i = 0; i < player[0].skeleton.num_joints; i++) {
+ if (player[0].skeleton.joints[i].position.y * player[0].scale + player[0].coords.y > target.y)
+ target.y = player[0].skeleton.joints[i].position.y * player[0].scale + player[0].coords.y;
+ }
+ target.y += .1;
+ }
+ if (player[0].skeleton.free != 2/*&&!autocam*/) {
+ cameraspeed = 20;
+ if (findLengthfast(&player[0].velocity) > 400) {
+ cameraspeed = 20 + (findLength(&player[0].velocity) - 20) * .96;
+ }
+ if (player[0].skeleton.free == 0 && player[0].animTarget != hanganim && player[0].animTarget != climbanim)target.y += 1.4;
+ coltarget = target - cameraloc;
+ if (findLengthfast(&coltarget) < multiplier * multiplier * 400)cameraloc = target;
+ else {
+ Normalise(&coltarget);
+ if (player[0].animTarget != hanganim && player[0].animTarget != climbanim && player[0].animCurrent != climbanim && player[0].currentoffset.x == 0)cameraloc = cameraloc + coltarget * multiplier * cameraspeed;
+ else cameraloc = cameraloc + coltarget * multiplier * 8;
+ }
+ if (editorenabled)cameraloc = target;
+ cameradist += multiplier * 5;
+ if (cameradist > 2.3)cameradist = 2.3;
+ viewer = cameraloc - facing * cameradist;
+ colviewer = viewer;
+ coltarget = cameraloc;
+ objects.SphereCheckPossible(&colviewer, findDistance(&colviewer, &coltarget));
+ if (terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
+ for (int j = 0; j < terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz]; j++) {
+ int i = terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
+ colviewer = viewer;
+ coltarget = cameraloc;
+ if (objects.model[i].LineCheckPossible(&colviewer, &coltarget, &col, &objects.position[i], &objects.yaw[i]) != -1)viewer = col;
+ }
+ if (terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
+ for (int j = 0; j < terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz]; j++) {
+ int i = terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
+ colviewer = viewer;
+ if (objects.model[i].SphereCheck(&colviewer, .15, &col, &objects.position[i], &objects.yaw[i]) != -1) {
+ viewer = colviewer;
}
}
- cameradist=findDistance(&viewer,&target);
- viewer.y=max((double)viewer.y,terrain.getHeight(viewer.x,viewer.z)+.6);
- if(cameraloc.y<terrain.getHeight(cameraloc.x,cameraloc.z)){
- cameraloc.y=terrain.getHeight(cameraloc.x,cameraloc.z);
+ cameradist = findDistance(&viewer, &target);
+ viewer.y = max((double)viewer.y, terrain.getHeight(viewer.x, viewer.z) + .6);
+ if (cameraloc.y < terrain.getHeight(cameraloc.x, cameraloc.z)) {
+ cameraloc.y = terrain.getHeight(cameraloc.x, cameraloc.z);
}
- }
+ }
/*
//what did autocam do?
- if(player[0].skeleton.free!=2&&autocam){
- cameraspeed=20;
- if(findLengthfast(&player[0].velocity)>400){
- cameraspeed=20+(findLength(&player[0].velocity)-20)*.96;
- }
- if(player[0].skeleton.free==0&&player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim)target.y+=1.4;
- cameradist+=multiplier*5;
- if(cameradist>3.3)cameradist=3.3;
- coltarget=target-cameraloc;
- if(findLengthfast(&coltarget)<multiplier*multiplier*400)cameraloc=target;
- else if(findLengthfast(&coltarget)>1)
- {
- Normalise(&coltarget);
- if(player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim&&player[0].animCurrent!=climbanim&&player[0].currentoffset.x==0)cameraloc=cameraloc+coltarget*multiplier*cameraspeed;
- else cameraloc=cameraloc+coltarget*multiplier*8;
- }
- if(editorenabled)cameraloc=target;
- viewer=cameraloc;
- colviewer=viewer;
- coltarget=cameraloc;
- objects.SphereCheckPossible(&colviewer, findDistance(&colviewer,&coltarget));
- if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
- for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
- int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
- colviewer=viewer;
- coltarget=cameraloc;
- if(objects.model[i].LineCheckPossible(&colviewer,&coltarget,&col,&objects.position[i],&objects.yaw[i])!=-1)viewer=col;
- }
+ if(player[0].skeleton.free!=2&&autocam){
+ cameraspeed=20;
+ if(findLengthfast(&player[0].velocity)>400){
+ cameraspeed=20+(findLength(&player[0].velocity)-20)*.96;
+ }
+ if(player[0].skeleton.free==0&&player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim)target.y+=1.4;
+ cameradist+=multiplier*5;
+ if(cameradist>3.3)cameradist=3.3;
+ coltarget=target-cameraloc;
+ if(findLengthfast(&coltarget)<multiplier*multiplier*400)cameraloc=target;
+ else if(findLengthfast(&coltarget)>1)
+ {
+ Normalise(&coltarget);
+ if(player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim&&player[0].animCurrent!=climbanim&&player[0].currentoffset.x==0)cameraloc=cameraloc+coltarget*multiplier*cameraspeed;
+ else cameraloc=cameraloc+coltarget*multiplier*8;
+ }
+ if(editorenabled)cameraloc=target;
+ viewer=cameraloc;
+ colviewer=viewer;
+ coltarget=cameraloc;
+ objects.SphereCheckPossible(&colviewer, findDistance(&colviewer,&coltarget));
+ if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
+ for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
+ int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
+ colviewer=viewer;
+ coltarget=cameraloc;
+ if(objects.model[i].LineCheckPossible(&colviewer,&coltarget,&col,&objects.position[i],&objects.yaw[i])!=-1)viewer=col;
+ }
if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
if(cameraloc.y<terrain.getHeight(cameraloc.x,cameraloc.z)){
cameraloc.y=terrain.getHeight(cameraloc.x,cameraloc.z);
}
- }
+ }
*/
- if(camerashake>.8)camerashake=.8;
- //if(woozy>10)woozy=10;
- //woozy+=multiplier;
- woozy+=multiplier;
- if(player[0].dead)camerashake=0;
- if(player[0].dead)woozy=0;
- camerashake-=multiplier*2;
- blackout-=multiplier*2;
- //if(player[0].isCrouch())woozy-=multiplier*8;
- if(camerashake<0)camerashake=0;
- if(blackout<0)blackout=0;
- //if(woozy<0)woozy=0;
- if(camerashake){
- viewer.x+=(float)(Random()%100)*.0005*camerashake;
- viewer.y+=(float)(Random()%100)*.0005*camerashake;
- viewer.z+=(float)(Random()%100)*.0005*camerashake;
- }
- }
+ if (camerashake > .8)camerashake = .8;
+ //if(woozy>10)woozy=10;
+ //woozy+=multiplier;
+ woozy += multiplier;
+ if (player[0].dead)camerashake = 0;
+ if (player[0].dead)woozy = 0;
+ camerashake -= multiplier * 2;
+ blackout -= multiplier * 2;
+ //if(player[0].isCrouch())woozy-=multiplier*8;
+ if (camerashake < 0)camerashake = 0;
+ if (blackout < 0)blackout = 0;
+ //if(woozy<0)woozy=0;
+ if (camerashake) {
+ viewer.x += (float)(Random() % 100) * .0005 * camerashake;
+ viewer.y += (float)(Random() % 100) * .0005 * camerashake;
+ viewer.z += (float)(Random() % 100) * .0005 * camerashake;
+ }
+ }
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
float precipdelay = 0;
float gamespeed = 0;
float oldgamespeed = 0;
-float tintr = 0,tintg = 0,tintb = 0;
+float tintr = 0, tintg = 0, tintb = 0;
int difficulty = 0;
float multiplier = 0;
float realmultiplier = 0;
-float screenwidth = 0,screenheight = 0;
+float screenwidth = 0, screenheight = 0;
float viewdistance = 0;
XYZ viewer;
XYZ viewerfacing;
Objects objects;
int slomo = 0;
float slomodelay = 0;
-GLubyte bloodText[512*512*3] = {0};
-GLubyte wolfbloodText[512*512*3] = {0};
+GLubyte bloodText[512 * 512 * 3] = {0};
+GLubyte wolfbloodText[512 * 512 * 3] = {0};
float colors[3] = {0};
int bloodtoggle = 0;
bool osx = false;
bool mousejump = false;
bool freeze = false;
bool winfreeze = false;
-float flashamount = 0,flashr = 0,flashg = 0,flashb = 0;
+float flashamount = 0, flashr = 0, flashg = 0, flashb = 0;
int flashdelay = 0;
bool vblsync = false;
float motionbluramount = 0;
int hotspottype[40] = {0};
float hotspotsize[40] = {0};
char hotspottext[40][256] = {0};
-int currenthotspot = 0;
+int currenthotspot = 0;
int killhotspot = 0;
float menupulse = 0;
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
extern bool keyboardfrozen;
-bool keyDown[SDLK_LAST+6];
-bool keyPressed[SDLK_LAST+6];
+bool keyDown[SDLK_LAST + 6];
+bool keyPressed[SDLK_LAST + 6];
-void Input::Tick(){
+void Input::Tick()
+{
SDL_PumpEvents();
- Uint8 *keyState = SDL_GetKeyState(NULL);
- for(int i=0;i<SDLK_LAST;i++){
- keyPressed[i] = !keyDown[i]&&keyState[i];
+ Uint8 *keyState = SDL_GetKeyState(NULL);
+ for (int i = 0; i < SDLK_LAST; i++) {
+ keyPressed[i] = !keyDown[i] && keyState[i];
keyDown[i] = keyState[i];
}
- Uint8 mb = SDL_GetMouseState(NULL,NULL);
- for(int i=1;i<6;i++){
- keyPressed[SDLK_LAST+i] = !keyDown[SDLK_LAST+i]&&(mb&SDL_BUTTON(i));
- keyDown[SDLK_LAST+i] = (mb&SDL_BUTTON(i));
+ Uint8 mb = SDL_GetMouseState(NULL, NULL);
+ for (int i = 1; i < 6; i++) {
+ keyPressed[SDLK_LAST + i] = !keyDown[SDLK_LAST + i] && (mb & SDL_BUTTON(i));
+ keyDown[SDLK_LAST + i] = (mb & SDL_BUTTON(i));
}
}
-bool Input::isKeyDown(int k) {
- if(keyboardfrozen||k>=SDLK_LAST+6) // really useful? check that.
+bool Input::isKeyDown(int k)
+{
+ if (keyboardfrozen || k >= SDLK_LAST + 6) // really useful? check that.
return false;
return keyDown[k];
}
-bool Input::isKeyPressed(int k) {
- if(keyboardfrozen||k>=SDLK_LAST+6)
+bool Input::isKeyPressed(int k)
+{
+ if (keyboardfrozen || k >= SDLK_LAST + 6)
return false;
return keyPressed[k];
}
-const char* Input::keyToChar(unsigned short i) {
- if(i<SDLK_LAST)
- return SDL_GetKeyName(SDLKey(i));
- else if(i==SDLK_LAST+SDL_BUTTON_LEFT)
- return "mouse1";
- else if(i==SDLK_LAST+SDL_BUTTON_RIGHT)
- return "mouse2";
- else if(i==SDLK_LAST+SDL_BUTTON_MIDDLE)
- return "mouse3";
- else
- return "unknown";
+const char* Input::keyToChar(unsigned short i)
+{
+ if (i < SDLK_LAST)
+ return SDL_GetKeyName(SDLKey(i));
+ else if (i == SDLK_LAST + SDL_BUTTON_LEFT)
+ return "mouse1";
+ else if (i == SDLK_LAST + SDL_BUTTON_RIGHT)
+ return "mouse2";
+ else if (i == SDLK_LAST + SDL_BUTTON_MIDDLE)
+ return "mouse3";
+ else
+ return "unknown";
}
-unsigned short Input::CharToKey(const char* which) {
- for(unsigned short i=0;i<SDLK_LAST;i++) {
- if(!strcasecmp(which,SDL_GetKeyName(SDLKey(i))))
- return i;
- }
- if(!strcasecmp(which,"mouse1")){
- return MOUSEBUTTON1;
- }
- if(!strcasecmp(which,"mouse2")){
- return MOUSEBUTTON2;
- }
- return SDLK_LAST;
+unsigned short Input::CharToKey(const char* which)
+{
+ for (unsigned short i = 0; i < SDLK_LAST; i++) {
+ if (!strcasecmp(which, SDL_GetKeyName(SDLKey(i))))
+ return i;
+ }
+ if (!strcasecmp(which, "mouse1")) {
+ return MOUSEBUTTON1;
+ }
+ if (!strcasecmp(which, "mouse2")) {
+ return MOUSEBUTTON2;
+ }
+ return SDLK_LAST;
}
-Boolean Input::MouseClicked(){
- return isKeyPressed(SDLK_LAST+SDL_BUTTON_LEFT);
+Boolean Input::MouseClicked()
+{
+ return isKeyPressed(SDLK_LAST + SDL_BUTTON_LEFT);
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#define MOUSEBUTTON2 SDLK_LAST+SDL_BUTTON_RIGHT
/**> FUNCTION PROTOTYPES <**/
-class Input {
- public:
- static void Tick();
- static bool isKeyDown(int k);
- static bool isKeyPressed(int k);
- static const char* keyToChar(unsigned short which);
- static unsigned short CharToKey(const char* which);
- static Boolean MouseClicked();
+class Input
+{
+public:
+ static void Tick();
+ static bool isKeyDown(int k);
+ static bool isKeyPressed(int k);
+ static const char* keyToChar(unsigned short which);
+ static unsigned short CharToKey(const char* which);
+ static Boolean MouseClicked();
};
#endif
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
/**> HEADER FILES <**/
#include "Lights.h"
-void SetUpLight(Light* whichsource, int whichlight){
- static float qattenuation[]={0.0002f};
- static float cattenuation[]={1.5f};
- static float lattenuation[]={0.5f};
- static float zattenuation[]={0.0f};
-
- //Initialize lights
- if(whichlight==0){
- GLfloat LightAmbient[]= { whichsource->ambient[0], whichsource->ambient[1], whichsource->ambient[2], 1.0f};
- GLfloat LightDiffuse[]= { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
- GLfloat LightPosition[]= { whichsource->location.x, whichsource->location.y, whichsource->location.z, 0.0f };
-
- //glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qattenuation);
- glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
- glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
- glEnable(GL_LIGHT0);
- }else{
- GLenum lightselect=GL_LIGHT1;
- switch (whichlight){
- case 2:
- lightselect=GL_LIGHT2;
- break;
- case 3:
- lightselect=GL_LIGHT3;
- break;
- case 4:
- lightselect=GL_LIGHT4;
- break;
- case 5:
- lightselect=GL_LIGHT5;
- break;
- case 6:
- lightselect=GL_LIGHT6;
- break;
- case 7:
- lightselect=GL_LIGHT7;
- break;
- }
-
- GLfloat LightAmbient[]= { 0, 0, 0, 1.0f};
- GLfloat LightDiffuse[]= { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
- GLfloat LightPosition[]= { whichsource->location.x, whichsource->location.y, whichsource->location.z, 1.0f };
-
- glLightfv(lightselect, GL_QUADRATIC_ATTENUATION, qattenuation);
- glLightfv(lightselect, GL_POSITION, LightPosition);
- glLightfv(lightselect, GL_AMBIENT, LightAmbient);
- glLightfv(lightselect, GL_DIFFUSE, LightDiffuse);
- glEnable(lightselect);
-
- }
+void SetUpLight(Light* whichsource, int whichlight)
+{
+ static float qattenuation[] = {0.0002f};
+ static float cattenuation[] = {1.5f};
+ static float lattenuation[] = {0.5f};
+ static float zattenuation[] = {0.0f};
+
+ //Initialize lights
+ if (whichlight == 0) {
+ GLfloat LightAmbient[] = { whichsource->ambient[0], whichsource->ambient[1], whichsource->ambient[2], 1.0f};
+ GLfloat LightDiffuse[] = { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
+ GLfloat LightPosition[] = { whichsource->location.x, whichsource->location.y, whichsource->location.z, 0.0f };
+
+ //glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qattenuation);
+ glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+ glEnable(GL_LIGHT0);
+ } else {
+ GLenum lightselect = GL_LIGHT1;
+ switch (whichlight) {
+ case 2:
+ lightselect = GL_LIGHT2;
+ break;
+ case 3:
+ lightselect = GL_LIGHT3;
+ break;
+ case 4:
+ lightselect = GL_LIGHT4;
+ break;
+ case 5:
+ lightselect = GL_LIGHT5;
+ break;
+ case 6:
+ lightselect = GL_LIGHT6;
+ break;
+ case 7:
+ lightselect = GL_LIGHT7;
+ break;
+ }
+
+ GLfloat LightAmbient[] = { 0, 0, 0, 1.0f};
+ GLfloat LightDiffuse[] = { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
+ GLfloat LightPosition[] = { whichsource->location.x, whichsource->location.y, whichsource->location.z, 1.0f };
+
+ glLightfv(lightselect, GL_QUADRATIC_ATTENUATION, qattenuation);
+ glLightfv(lightselect, GL_POSITION, LightPosition);
+ glLightfv(lightselect, GL_AMBIENT, LightAmbient);
+ glLightfv(lightselect, GL_DIFFUSE, LightDiffuse);
+ glEnable(lightselect);
+
+ }
}
-void SetUpMainLight(Light* whichsource, int whichlight, float ambientr, float ambientg, float ambientb){
- static float qattenuation[]={0.0f};
+void SetUpMainLight(Light* whichsource, int whichlight, float ambientr, float ambientg, float ambientb)
+{
+ static float qattenuation[] = {0.0f};
- //Initialize lights
+ //Initialize lights
- if(whichlight==0){
- GLfloat LightAmbient[]= { ambientr, ambientg, ambientb, 1.0f};
- GLfloat LightDiffuse[]= { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
- GLfloat LightPosition[]= { whichsource->location.x, whichsource->location.y, whichsource->location.z, 1.0f };
+ if (whichlight == 0) {
+ GLfloat LightAmbient[] = { ambientr, ambientg, ambientb, 1.0f};
+ GLfloat LightDiffuse[] = { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
+ GLfloat LightPosition[] = { whichsource->location.x, whichsource->location.y, whichsource->location.z, 1.0f };
- glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qattenuation);
- glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
- glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
- glEnable(GL_LIGHT0);
- }
+ glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qattenuation);
+ glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+ glEnable(GL_LIGHT0);
+ }
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#include "gamegl.h"
#include "Quaternions.h"
-class Light{
+class Light
+{
public:
- GLint type;
- GLfloat color[3];
- GLfloat ambient[3];
- int attach;
- XYZ location;
+ GLint type;
+ GLfloat color[3];
+ GLfloat ambient[3];
+ int attach;
+ XYZ location;
inline void setColors(GLfloat cr, GLfloat cg, GLfloat cb,
- GLfloat ar, GLfloat ag, GLfloat ab){
- color[0]=cr;
- color[1]=cg;
- color[2]=cb;
- ambient[0]=ar;
- ambient[1]=ag;
- ambient[2]=ab;
+ GLfloat ar, GLfloat ag, GLfloat ab) {
+ color[0] = cr;
+ color[1] = cg;
+ color[2] = cb;
+ ambient[0] = ar;
+ ambient[1] = ag;
+ ambient[2] = ab;
}
};
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
class AppTime
{
public:
- AppTime()
- {
- counterRate = 1;
- baseCounter = 0;
- QueryPerformanceFrequency( (LARGE_INTEGER*)&counterRate);
- QueryPerformanceCounter( (LARGE_INTEGER*)&baseCounter);
- }
- __int64 counterRate; // LARGE_INTEGER type has no math functions so use int64
- __int64 baseCounter;
+ AppTime() {
+ counterRate = 1;
+ baseCounter = 0;
+ QueryPerformanceFrequency( (LARGE_INTEGER*)&counterRate);
+ QueryPerformanceCounter( (LARGE_INTEGER*)&baseCounter);
+ }
+ __int64 counterRate; // LARGE_INTEGER type has no math functions so use int64
+ __int64 baseCounter;
};
static AppTime g_appTime;
void CopyCStringToPascal( const char* src, unsigned char dst[256])
{
- int len = strlen( src);
- dst[ 0] = len;
- memcpy( dst + 1, src, len);
+ int len = strlen( src);
+ dst[ 0] = len;
+ memcpy( dst + 1, src, len);
}
void CopyPascalStringToC( const unsigned char* src, char* dst)
{
- int len = src[ 0];
- memcpy( dst, src + 1, len);
- dst[ len] = 0;
+ int len = src[ 0];
+ memcpy( dst, src + 1, len);
+ dst[ len] = 0;
}
AbsoluteTime UpTime()
{
- __int64 counter;
- QueryPerformanceCounter( (LARGE_INTEGER*)&counter);
+ __int64 counter;
+ QueryPerformanceCounter( (LARGE_INTEGER*)&counter);
- counter -= g_appTime.baseCounter;
+ counter -= g_appTime.baseCounter;
- AbsoluteTime time;
- time.lo = (unsigned long)counter;
- time.hi = (unsigned long)(counter >> 32);
- return time;
+ AbsoluteTime time;
+ time.lo = (unsigned long)counter;
+ time.hi = (unsigned long)(counter >> 32);
+ return time;
}
Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b)
{
- __int64 value = a.hi;
- value <<= 32;
- value |= a.lo;
- __int64 value2 = b.hi;
- value2 <<= 32;
- value2 |= b.lo;
- value -= value2;
-
- if (value <= 0)
- return durationImmediate;
-
- __int64 frac = value % g_appTime.counterRate;
- value /= g_appTime.counterRate;
-
- Duration time;
-
- if (value == 0)
- {
- frac *= -1000000;
- frac /= g_appTime.counterRate;
- time = (Duration)frac;
- }
- else
- {
- frac *= 1000;
- frac /= g_appTime.counterRate;
- value *= 1000;
- value += frac;
- time = (Duration)value;
- }
-
- return time;
+ __int64 value = a.hi;
+ value <<= 32;
+ value |= a.lo;
+ __int64 value2 = b.hi;
+ value2 <<= 32;
+ value2 |= b.lo;
+ value -= value2;
+
+ if (value <= 0)
+ return durationImmediate;
+
+ __int64 frac = value % g_appTime.counterRate;
+ value /= g_appTime.counterRate;
+
+ Duration time;
+
+ if (value == 0) {
+ frac *= -1000000;
+ frac /= g_appTime.counterRate;
+ time = (Duration)frac;
+ } else {
+ frac *= 1000;
+ frac /= g_appTime.counterRate;
+ value *= 1000;
+ value += frac;
+ time = (Duration)value;
+ }
+
+ return time;
}
return(1); /* quick rejection: exists in current case. */
ptr = strrchr(buf, '/'); /* find entry at end of path. */
- if (ptr == NULL)
- {
+ if (ptr == NULL) {
dirp = opendir(".");
ptr = buf;
} /* if */
- else
- {
+ else {
*ptr = '\0';
dirp = opendir(buf);
*ptr = '/';
} /* else */
struct dirent *dent;
- while ((dent = readdir(dirp)) != NULL)
- {
- if (strcasecmp(dent->d_name, ptr) == 0)
- {
+ while ((dent = readdir(dirp)) != NULL) {
+ if (strcasecmp(dent->d_name, ptr) == 0) {
strcpy(ptr, dent->d_name); /* found a match. Overwrite with this case. */
closedir(dirp);
return(1);
static inline const char *getPrefPath(void)
{
static char *prefpath = NULL;
- if (prefpath == NULL)
- {
+ if (prefpath == NULL) {
const char *homedir = getenv("HOME");
if (homedir == NULL)
homedir = getUserDirByUID();
char *prevptr;
ptr = prevptr = buf;
- while (ptr = strchr(ptr + 1, '/'))
- {
+ while (ptr = strchr(ptr + 1, '/')) {
*ptr = '\0'; /* block this path section off */
rc = locateOneElement(buf);
- if (!rc)
- {
+ if (!rc) {
if (makedirs) /* normal if we're writing; build dirs! */
mkdir(buf, S_IRWXU);
- else
- {
+ else {
*ptr = '/'; /* restore path separator */
return(-2); /* missing element in path. */
} /* else */
if (orgfilename == g_filename) // recursion?
return g_filename;
- // translate filename into proper path name
- if (orgfilename[ 0] == ':')
- orgfilename++;
- strcpy( g_filename, orgfilename);
+ // translate filename into proper path name
+ if (orgfilename[ 0] == ':')
+ orgfilename++;
+ strcpy( g_filename, orgfilename);
- for (int n = 0; g_filename[ n]; n++)
- {
- if (g_filename[ n] == ':')
- g_filename[ n] = '/';
+ for (int n = 0; g_filename[ n]; n++) {
+ if (g_filename[ n] == ':')
+ g_filename[ n] = '/';
- else if (g_filename[ n] == '\\')
- g_filename[ n] = '/';
- }
+ else if (g_filename[ n] == '\\')
+ g_filename[ n] = '/';
+ }
- #if PLATFORM_UNIX
+#if PLATFORM_UNIX
locateCorrectFile(g_filename, mode);
- #endif
+#endif
- return g_filename;
+ return g_filename;
}
#endif
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
typedef bool Boolean;
-struct Point
-{
- short v;
- short h;
+struct Point {
+ short v;
+ short h;
};
typedef signed char SInt8;
void CopyPascalStringToC( const unsigned char* src, char* dst);
-typedef struct AbsoluteTime
-{
- unsigned long hi;
- unsigned long lo;
-} AbsoluteTime;
+typedef struct AbsoluteTime {
+ unsigned long hi;
+ unsigned long lo;
+} AbsoluteTime;
AbsoluteTime UpTime(); // NOTE: returns time since app started, not system start
-typedef long Duration;
-
-enum
-{
- durationMicrosecond = -1,
- durationMillisecond = 1,
- durationSecond = 1000,
- durationMinute = 1000 * 60,
- durationHour = 1000 * 60 * 60,
- durationDay = 1000 * 60 * 60 * 24,
- durationForever = 0x7FFFFFFF,
- durationImmediate = 0,
-};
+typedef long Duration;
+
+enum {
+ durationMicrosecond = -1,
+ durationMillisecond = 1,
+ durationSecond = 1000,
+ durationMinute = 1000 * 60,
+ durationHour = 1000 * 60 * 60,
+ durationDay = 1000 * 60 * 60 * 24,
+ durationForever = 0x7FFFFFFF,
+ durationImmediate = 0,
+};
Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b);
#ifdef _MSC_VER
inline bool isnormal( double x)
{
- int ret = _fpclass( x);
- return (ret == _FPCLASS_NN || ret == _FPCLASS_PN);
+ int ret = _fpclass( x);
+ return (ret == _FPCLASS_NN || ret == _FPCLASS_PN);
}
#else
#include <stdint.h>
extern float multiplier;
struct MenuItem {
- enum MenuItemType{NONE,LABEL,BUTTON,IMAGE,IMAGEBUTTON,MAPMARKER,MAPLINE,MAPLABEL} type;
+ enum MenuItemType {NONE, LABEL, BUTTON, IMAGE, IMAGEBUTTON, MAPMARKER, MAPLINE, MAPLABEL} type;
int id;
string text;
Texture texture;
- int x,y,w,h;
- float r,g,b;
+ int x, y, w, h;
+ float r, g, b;
float effectfade;
float linestartsize;
float lineendsize;
void init(MenuItemType _type, int _id, const string& _text, Texture _texture,
- int _x, int _y, int _w, int _h, float _r, float _g, float _b,
- float _linestartsize=1, float _lineendsize=1){
- type=_type;
- id=_id;
- text=_text;
- texture=_texture;
- x=_x; y=_y; w=_w; h=_h;
- r=_r; g=_g; b=_b;
- effectfade=0;
- linestartsize=_linestartsize;
- lineendsize=_lineendsize;
- if(type==MenuItem::BUTTON){
- if(w==-1)
- w=text.length()*10;
- if(h==-1)
- h=20;
+ int _x, int _y, int _w, int _h, float _r, float _g, float _b,
+ float _linestartsize = 1, float _lineendsize = 1) {
+ type = _type;
+ id = _id;
+ text = _text;
+ texture = _texture;
+ x = _x;
+ y = _y;
+ w = _w;
+ h = _h;
+ r = _r;
+ g = _g;
+ b = _b;
+ effectfade = 0;
+ linestartsize = _linestartsize;
+ lineendsize = _lineendsize;
+ if (type == MenuItem::BUTTON) {
+ if (w == -1)
+ w = text.length() * 10;
+ if (h == -1)
+ h = 20;
}
}
};
-void Menu::clearMenu(){
+void Menu::clearMenu()
+{
items.clear();
}
-void Menu::addLabel(int id,const string& text,int x,int y,float r,float g,float b){
+void Menu::addLabel(int id, const string& text, int x, int y, float r, float g, float b)
+{
items.push_back(MenuItem());
- items.back().init(MenuItem::LABEL,id,text,Texture(),x,y,-1,-1,r,g,b);
+ items.back().init(MenuItem::LABEL, id, text, Texture(), x, y, -1, -1, r, g, b);
}
-void Menu::addButton(int id,const string& text,int x,int y,float r,float g,float b){
+void Menu::addButton(int id, const string& text, int x, int y, float r, float g, float b)
+{
items.push_back(MenuItem());
- items.back().init(MenuItem::BUTTON,id,text,Texture(),x,y,-1,-1,r,g,b);
+ items.back().init(MenuItem::BUTTON, id, text, Texture(), x, y, -1, -1, r, g, b);
}
-void Menu::addImage(int id,Texture texture,int x,int y,int w,int h,float r,float g,float b){
+void Menu::addImage(int id, Texture texture, int x, int y, int w, int h, float r, float g, float b)
+{
items.push_back(MenuItem());
- items.back().init(MenuItem::IMAGE,id,"",texture,x,y,w,h,r,g,b);
+ items.back().init(MenuItem::IMAGE, id, "", texture, x, y, w, h, r, g, b);
}
-void Menu::addButtonImage(int id,Texture texture,int x,int y,int w,int h,float r,float g,float b){
+void Menu::addButtonImage(int id, Texture texture, int x, int y, int w, int h, float r, float g, float b)
+{
items.push_back(MenuItem());
- items.back().init(MenuItem::IMAGEBUTTON,id,"",texture,x,y,w,h,r,g,b);
+ items.back().init(MenuItem::IMAGEBUTTON, id, "", texture, x, y, w, h, r, g, b);
}
-void Menu::addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r,float g,float b){
+void Menu::addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r, float g, float b)
+{
items.push_back(MenuItem());
- items.back().init(MenuItem::MAPLINE,-1,"",Texture(),x,y,w,h,r,g,b,startsize,endsize);
+ items.back().init(MenuItem::MAPLINE, -1, "", Texture(), x, y, w, h, r, g, b, startsize, endsize);
}
-void Menu::addMapMarker(int id,Texture texture,int x,int y,int w,int h,float r,float g,float b){
+void Menu::addMapMarker(int id, Texture texture, int x, int y, int w, int h, float r, float g, float b)
+{
items.push_back(MenuItem());
- items.back().init(MenuItem::MAPMARKER,id,"",texture,x,y,w,h,r,g,b);
+ items.back().init(MenuItem::MAPMARKER, id, "", texture, x, y, w, h, r, g, b);
}
-void Menu::addMapLabel(int id,const string& text,int x,int y,float r,float g,float b){
+void Menu::addMapLabel(int id, const string& text, int x, int y, float r, float g, float b)
+{
items.push_back(MenuItem());
- items.back().init(MenuItem::MAPLABEL,id,text,Texture(),x,y,-1,-1,r,g,b);
+ items.back().init(MenuItem::MAPLABEL, id, text, Texture(), x, y, -1, -1, r, g, b);
}
-void Menu::setText(int id,const string& text){
- for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
- if(it->id==id){
- it->text=text;
- it->w=it->text.length()*10;
+void Menu::setText(int id, const string& text)
+{
+ for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++)
+ if (it->id == id) {
+ it->text = text;
+ it->w = it->text.length() * 10;
break;
}
}
-void Menu::setText(int id,const string& text,int x,int y,int w,int h){
- for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
- if(it->id==id){
- it->text=text;
- it->x=x;
- it->y=y;
- if(w==-1)
- it->w=it->text.length()*10;
- if(h==-1)
- it->h=20;
+void Menu::setText(int id, const string& text, int x, int y, int w, int h)
+{
+ for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++)
+ if (it->id == id) {
+ it->text = text;
+ it->x = x;
+ it->y = y;
+ if (w == -1)
+ it->w = it->text.length() * 10;
+ if (h == -1)
+ it->h = 20;
break;
}
}
-int Menu::getSelected(int mousex, int mousey){
- for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
- if(it->type==MenuItem::BUTTON || it->type==MenuItem::IMAGEBUTTON || it->type==MenuItem::MAPMARKER) {
- int mx=mousex;
- int my=mousey;
- if(it->type==MenuItem::MAPMARKER){
- mx-=1;
- my+=2;
+int Menu::getSelected(int mousex, int mousey)
+{
+ for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++)
+ if (it->type == MenuItem::BUTTON || it->type == MenuItem::IMAGEBUTTON || it->type == MenuItem::MAPMARKER) {
+ int mx = mousex;
+ int my = mousey;
+ if (it->type == MenuItem::MAPMARKER) {
+ mx -= 1;
+ my += 2;
}
- if(mx>=it->x && mx<it->x+it->w && my>=it->y && my<it->y+it->h)
+ if (mx >= it->x && mx < it->x + it->w && my >= it->y && my < it->y + it->h)
return it->id;
}
return -1;
}
-void GUITick(){
- for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++){
- if(it->id==Game::selected){
- it->effectfade+=multiplier*5;
- if(it->effectfade>1)
- it->effectfade=1;
- }else{
- it->effectfade-=multiplier*5;
- if(it->effectfade<0)
- it->effectfade=0;
- }
+void GUITick()
+{
+ for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++) {
+ if (it->id == Game::selected) {
+ it->effectfade += multiplier * 5;
+ if (it->effectfade > 1)
+ it->effectfade = 1;
+ } else {
+ it->effectfade -= multiplier * 5;
+ if (it->effectfade < 0)
+ it->effectfade = 0;
+ }
}
}
-void Menu::drawItems(){
+void Menu::drawItems()
+{
GUITick();
glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
- for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++){
- switch(it->type){
+ for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++) {
+ switch (it->type) {
case MenuItem::IMAGE:
case MenuItem::IMAGEBUTTON:
case MenuItem::MAPMARKER:
- glColor4f(it->r,it->g,it->b,1);
+ glColor4f(it->r, it->g, it->b, 1);
glPushMatrix();
- if(it->type==MenuItem::MAPMARKER){
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glTranslatef(2.5,-4.5,0); //from old code
- }else{
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ if (it->type == MenuItem::MAPMARKER) {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glTranslatef(2.5, -4.5, 0); //from old code
+ } else {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}
it->texture.bind();
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(it->x,it->y,0);
- glTexCoord2f(1,0);
- glVertex3f(it->x+it->w,it->y,0);
- glTexCoord2f(1,1);
- glVertex3f(it->x+it->w,it->y+it->h,0);
- glTexCoord2f(0,1);
- glVertex3f(it->x,it->y+it->h,0);
+ glTexCoord2f(0, 0);
+ glVertex3f(it->x, it->y, 0);
+ glTexCoord2f(1, 0);
+ glVertex3f(it->x + it->w, it->y, 0);
+ glTexCoord2f(1, 1);
+ glVertex3f(it->x + it->w, it->y + it->h, 0);
+ glTexCoord2f(0, 1);
+ glVertex3f(it->x, it->y + it->h, 0);
glEnd();
- if(it->type!=MenuItem::IMAGE){
+ if (it->type != MenuItem::IMAGE) {
//mouseover highlight
- for(int i=0;i<10;i++){
- if(1-((float)i)/10-(1-it->effectfade)>0){
- glColor4f(it->r,it->g,it->b,(1-((float)i)/10-(1-it->effectfade))*.25);
+ for (int i = 0; i < 10; i++) {
+ if (1 - ((float)i) / 10 - (1 - it->effectfade) > 0) {
+ glColor4f(it->r, it->g, it->b, (1 - ((float)i) / 10 - (1 - it->effectfade))*.25);
glBegin(GL_QUADS);
- glTexCoord2f(0,0);
- glVertex3f(it->x-((float)i)*1/2, it->y-((float)i)*1/2, 0);
- glTexCoord2f(1,0);
- glVertex3f(it->x+it->w+((float)i)*1/2, it->y-((float)i)*1/2, 0);
- glTexCoord2f(1,1);
- glVertex3f(it->x+it->w+((float)i)*1/2, it->y+it->h+((float)i)*1/2, 0);
- glTexCoord2f(0,1);
- glVertex3f(it->x-((float)i)*1/2, it->y+it->h+((float)i)*1/2, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(it->x - ((float)i) * 1 / 2, it->y - ((float)i) * 1 / 2, 0);
+ glTexCoord2f(1, 0);
+ glVertex3f(it->x + it->w + ((float)i) * 1 / 2, it->y - ((float)i) * 1 / 2, 0);
+ glTexCoord2f(1, 1);
+ glVertex3f(it->x + it->w + ((float)i) * 1 / 2, it->y + it->h + ((float)i) * 1 / 2, 0);
+ glTexCoord2f(0, 1);
+ glVertex3f(it->x - ((float)i) * 1 / 2, it->y + it->h + ((float)i) * 1 / 2, 0);
glEnd();
}
}
break;
case MenuItem::LABEL:
case MenuItem::BUTTON:
- glColor4f(it->r,it->g,it->b,1);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- Game::text->glPrint(it->x,it->y,it->text.c_str(),0,1,640,480);
- if(it->type!=MenuItem::LABEL){
+ glColor4f(it->r, it->g, it->b, 1);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ Game::text->glPrint(it->x, it->y, it->text.c_str(), 0, 1, 640, 480);
+ if (it->type != MenuItem::LABEL) {
//mouseover highlight
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- for(int i=0;i<15;i++){
- if(1-((float)i)/15-(1-it->effectfade)>0){
- glColor4f(it->r,it->g,it->b,(1-((float)i)/10-(1-it->effectfade))*.25);
- Game::text->glPrint(it->x-((float)i),it->y,it->text.c_str(),0,1+((float)i)/70,640,480);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ for (int i = 0; i < 15; i++) {
+ if (1 - ((float)i) / 15 - (1 - it->effectfade) > 0) {
+ glColor4f(it->r, it->g, it->b, (1 - ((float)i) / 10 - (1 - it->effectfade))*.25);
+ Game::text->glPrint(it->x - ((float)i), it->y, it->text.c_str(), 0, 1 + ((float)i) / 70, 640, 480);
}
}
}
break;
case MenuItem::MAPLABEL:
- Game::text->glPrintOutlined(0.9,0,0,it->x,it->y,it->text.c_str(),0,0.6,640,480);
+ Game::text->glPrintOutlined(0.9, 0, 0, it->x, it->y, it->text.c_str(), 0, 0.6, 640, 480);
break;
case MenuItem::MAPLINE: {
XYZ linestart;
- linestart.x=it->x;
- linestart.y=it->y;
- linestart.z=0;
+ linestart.x = it->x;
+ linestart.y = it->y;
+ linestart.z = 0;
XYZ lineend;
- lineend.x=it->x+it->w;
- lineend.y=it->y+it->h;
- lineend.z=0;
- XYZ offset=lineend-linestart;
- XYZ fac=offset;
+ lineend.x = it->x + it->w;
+ lineend.y = it->y + it->h;
+ lineend.z = 0;
+ XYZ offset = lineend - linestart;
+ XYZ fac = offset;
Normalise(&fac);
- offset=DoRotation(offset,0,0,90);
+ offset = DoRotation(offset, 0, 0, 90);
Normalise(&offset);
- linestart+=fac*4*it->linestartsize;
- lineend-=fac*4*it->lineendsize;
+ linestart += fac * 4 * it->linestartsize;
+ lineend -= fac * 4 * it->lineendsize;
- glDisable(GL_TEXTURE_2D);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glColor4f(it->r,it->g,it->b,1);
+ glDisable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(it->r, it->g, it->b, 1);
glPushMatrix();
- glTranslatef(2,-5,0); //from old code
+ glTranslatef(2, -5, 0); //from old code
glBegin(GL_QUADS);
- glVertex3f(linestart.x-offset.x*it->linestartsize, linestart.y-offset.y*it->linestartsize, 0.0f);
- glVertex3f(linestart.x+offset.x*it->linestartsize, linestart.y+offset.y*it->linestartsize, 0.0f);
- glVertex3f(lineend.x+offset.x*it->lineendsize, lineend.y+offset.y*it->lineendsize, 0.0f);
- glVertex3f(lineend.x-offset.x*it->lineendsize, lineend.y-offset.y*it->lineendsize, 0.0f);
+ glVertex3f(linestart.x - offset.x * it->linestartsize, linestart.y - offset.y * it->linestartsize, 0.0f);
+ glVertex3f(linestart.x + offset.x * it->linestartsize, linestart.y + offset.y * it->linestartsize, 0.0f);
+ glVertex3f(lineend.x + offset.x * it->lineendsize, lineend.y + offset.y * it->lineendsize, 0.0f);
+ glVertex3f(lineend.x - offset.x * it->lineendsize, lineend.y - offset.y * it->lineendsize, 0.0f);
glEnd();
glPopMatrix();
glEnable(GL_TEXTURE_2D);
- } break;
+ }
+ break;
}
}
}
#include "Game.h"
-namespace Menu {
- void clearMenu();
- void addLabel(int id,const string& text,int x,int y,float r=1,float g=0,float b=0);
- void addButton(int id,const string& text,int x,int y,float r=1,float g=0,float b=0);
- void addImage(int id,Texture texture,int x,int y,int w,int h,float r=1,float g=1,float b=1);
- void addButtonImage(int id,Texture texture,int x,int y,int w,int h,float r=1,float g=1,float b=1);
- void addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r,float g,float b);
- void addMapMarker(int id,Texture texture,int x,int y,int w,int h,float r,float g,float b);
- void addMapLabel(int id,const string& text,int x,int y,float r=1,float g=0,float b=0);
- void setText(int id,const string& text);
- void setText(int id,const string& text,int x,int y,int w,int h);
- int getSelected(int mousex, int mousey);
- void drawItems();
+namespace Menu
+{
+void clearMenu();
+void addLabel(int id, const string& text, int x, int y, float r = 1, float g = 0, float b = 0);
+void addButton(int id, const string& text, int x, int y, float r = 1, float g = 0, float b = 0);
+void addImage(int id, Texture texture, int x, int y, int w, int h, float r = 1, float g = 1, float b = 1);
+void addButtonImage(int id, Texture texture, int x, int y, int w, int h, float r = 1, float g = 1, float b = 1);
+void addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r, float g, float b);
+void addMapMarker(int id, Texture texture, int x, int y, int w, int h, float r, float g, float b);
+void addMapLabel(int id, const string& text, int x, int y, float r = 1, float g = 0, float b = 0);
+void setText(int id, const string& text);
+void setText(int id, const string& text, int x, int y, int w, int h);
+int getSelected(int mousex, int mousey);
+void drawItems();
}
#endif
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
extern bool visibleloading;
-int Model::LineCheck(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate)
+int Model::LineCheck(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate)
{
- static int j;
- static float distance;
- static float olddistance;
- static int intersecting;
- static int firstintersecting;
- static XYZ point;
-
- *p1=*p1-*move;
- *p2=*p2-*move;
- if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
- if(*rotate)*p2=DoRotation(*p2,0,-*rotate,0);
- if(!sphere_line_intersection(p1,p2,&boundingspherecenter,
- &boundingsphereradius))return -1;
- firstintersecting=-1;
-
- for (j=0;j<TriangleNum;j++){
- intersecting=LineFacetd(p1,p2,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point);
- distance=(point.x-p1->x)*(point.x-p1->x)+(point.y-p1->y)*(point.y-p1->y)+(point.z-p1->z)*(point.z-p1->z);
- if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j; *p=point;}
- }
-
- if(*rotate)*p=DoRotation(*p,0,*rotate,0);
- *p=*p+*move;
- return firstintersecting;
+ static int j;
+ static float distance;
+ static float olddistance;
+ static int intersecting;
+ static int firstintersecting;
+ static XYZ point;
+
+ *p1 = *p1 - *move;
+ *p2 = *p2 - *move;
+ if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+ if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0);
+ if (!sphere_line_intersection(p1, p2, &boundingspherecenter,
+ &boundingsphereradius))return -1;
+ firstintersecting = -1;
+
+ for (j = 0; j < TriangleNum; j++) {
+ intersecting = LineFacetd(p1, p2, &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]], &facenormals[j], &point);
+ distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z);
+ if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+ olddistance = distance;
+ firstintersecting = j;
+ *p = point;
+ }
+ }
+
+ if (*rotate)*p = DoRotation(*p, 0, *rotate, 0);
+ *p = *p + *move;
+ return firstintersecting;
}
-int Model::LineCheckSlide(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate)
+int Model::LineCheckSlide(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate)
{
- static int j;
- static float distance;
- static float olddistance;
- static int intersecting;
- static int firstintersecting;
- static XYZ point;
-
- *p1=*p1-*move;
- *p2=*p2-*move;
- if(!sphere_line_intersection(p1,p2,&boundingspherecenter,
- &boundingsphereradius))return -1;
- firstintersecting=-1;
- if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
- if(*rotate)*p2=DoRotation(*p2,0,-*rotate,0);
-
- for (j=0;j<TriangleNum;j++){
- intersecting=LineFacetd(p1,p2,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point);
- distance=(point.x-p1->x)*(point.x-p1->x)+(point.y-p1->y)*(point.y-p1->y)+(point.z-p1->z)*(point.z-p1->z);
- if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j;}
- }
-
- distance=abs((facenormals[firstintersecting].x*p2->x)+(facenormals[firstintersecting].y*p2->y)+(facenormals[firstintersecting].z*p2->z)-((facenormals[firstintersecting].x*vertex[Triangles[firstintersecting].vertex[0]].x)+(facenormals[firstintersecting].y*vertex[Triangles[firstintersecting].vertex[0]].y)+(facenormals[firstintersecting].z*vertex[Triangles[firstintersecting].vertex[0]].z)));
- *p2-=facenormals[firstintersecting]*distance;
-
- if(*rotate)*p2=DoRotation(*p2,0,*rotate,0);
- *p2=*p2+*move;
- return firstintersecting;
+ static int j;
+ static float distance;
+ static float olddistance;
+ static int intersecting;
+ static int firstintersecting;
+ static XYZ point;
+
+ *p1 = *p1 - *move;
+ *p2 = *p2 - *move;
+ if (!sphere_line_intersection(p1, p2, &boundingspherecenter,
+ &boundingsphereradius))return -1;
+ firstintersecting = -1;
+ if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+ if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0);
+
+ for (j = 0; j < TriangleNum; j++) {
+ intersecting = LineFacetd(p1, p2, &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]], &facenormals[j], &point);
+ distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z);
+ if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+ olddistance = distance;
+ firstintersecting = j;
+ }
+ }
+
+ distance = abs((facenormals[firstintersecting].x * p2->x) + (facenormals[firstintersecting].y * p2->y) + (facenormals[firstintersecting].z * p2->z) - ((facenormals[firstintersecting].x * vertex[Triangles[firstintersecting].vertex[0]].x) + (facenormals[firstintersecting].y * vertex[Triangles[firstintersecting].vertex[0]].y) + (facenormals[firstintersecting].z * vertex[Triangles[firstintersecting].vertex[0]].z)));
+ *p2 -= facenormals[firstintersecting] * distance;
+
+ if (*rotate)*p2 = DoRotation(*p2, 0, *rotate, 0);
+ *p2 = *p2 + *move;
+ return firstintersecting;
}
-int Model::LineCheckPossible(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate)
+int Model::LineCheckPossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate)
{
- static int j;
- static float distance;
- static float olddistance;
- static int intersecting;
- static int firstintersecting;
- static XYZ point;
-
- *p1=*p1-*move;
- *p2=*p2-*move;
- if(!sphere_line_intersection(p1,p2,&boundingspherecenter,
- &boundingsphereradius))return -1;
- firstintersecting=-1;
- if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
- if(*rotate)*p2=DoRotation(*p2,0,-*rotate,0);
-
- if(numpossible>0&&numpossible<TriangleNum)
- for (j=0;j<numpossible;j++){
- if(possible[j]>=0&&possible[j]<TriangleNum){
- intersecting=LineFacetd(p1,p2,&vertex[Triangles[possible[j]].vertex[0]],&vertex[Triangles[possible[j]].vertex[1]],&vertex[Triangles[possible[j]].vertex[2]],&facenormals[possible[j]],&point);
- distance=(point.x-p1->x)*(point.x-p1->x)+(point.y-p1->y)*(point.y-p1->y)+(point.z-p1->z)*(point.z-p1->z);
- if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=possible[j]; *p=point;}
- }
- }
-
- if(*rotate)*p=DoRotation(*p,0,*rotate,0);
- *p=*p+*move;
- return firstintersecting;
+ static int j;
+ static float distance;
+ static float olddistance;
+ static int intersecting;
+ static int firstintersecting;
+ static XYZ point;
+
+ *p1 = *p1 - *move;
+ *p2 = *p2 - *move;
+ if (!sphere_line_intersection(p1, p2, &boundingspherecenter,
+ &boundingsphereradius))return -1;
+ firstintersecting = -1;
+ if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+ if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0);
+
+ if (numpossible > 0 && numpossible < TriangleNum)
+ for (j = 0; j < numpossible; j++) {
+ if (possible[j] >= 0 && possible[j] < TriangleNum) {
+ intersecting = LineFacetd(p1, p2, &vertex[Triangles[possible[j]].vertex[0]], &vertex[Triangles[possible[j]].vertex[1]], &vertex[Triangles[possible[j]].vertex[2]], &facenormals[possible[j]], &point);
+ distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z);
+ if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+ olddistance = distance;
+ firstintersecting = possible[j];
+ *p = point;
+ }
+ }
+ }
+
+ if (*rotate)*p = DoRotation(*p, 0, *rotate, 0);
+ *p = *p + *move;
+ return firstintersecting;
}
-int Model::LineCheckSlidePossible(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate)
+int Model::LineCheckSlidePossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate)
{
- static int j;
- static float distance;
- static float olddistance;
- static int intersecting;
- static int firstintersecting;
- static XYZ point;
-
- *p1=*p1-*move;
- *p2=*p2-*move;
- if(!sphere_line_intersection(p1,p2,&boundingspherecenter,
- &boundingsphereradius))return -1;
- firstintersecting=-1;
- if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
- if(*rotate)*p2=DoRotation(*p2,0,-*rotate,0);
-
- if(numpossible)
- for (j=0;j<numpossible;j++){
- if(possible[j]>=0&&possible[j]<TriangleNum){
- intersecting=LineFacetd(p1,p2,&vertex[Triangles[possible[j]].vertex[0]],&vertex[Triangles[possible[j]].vertex[1]],&vertex[Triangles[possible[j]].vertex[2]],&facenormals[possible[j]],&point);
- distance=(point.x-p1->x)*(point.x-p1->x)+(point.y-p1->y)*(point.y-p1->y)+(point.z-p1->z)*(point.z-p1->z);
- if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=possible[j];}
- }
- }
-
- if(firstintersecting>0){
- distance=abs((facenormals[firstintersecting].x*p2->x)+(facenormals[firstintersecting].y*p2->y)+(facenormals[firstintersecting].z*p2->z)-((facenormals[firstintersecting].x*vertex[Triangles[firstintersecting].vertex[0]].x)+(facenormals[firstintersecting].y*vertex[Triangles[firstintersecting].vertex[0]].y)+(facenormals[firstintersecting].z*vertex[Triangles[firstintersecting].vertex[0]].z)));
- *p2-=facenormals[firstintersecting]*distance;
- }
-
- if(*rotate)*p2=DoRotation(*p2,0,*rotate,0);
- *p2=*p2+*move;
- return firstintersecting;
+ static int j;
+ static float distance;
+ static float olddistance;
+ static int intersecting;
+ static int firstintersecting;
+ static XYZ point;
+
+ *p1 = *p1 - *move;
+ *p2 = *p2 - *move;
+ if (!sphere_line_intersection(p1, p2, &boundingspherecenter,
+ &boundingsphereradius))return -1;
+ firstintersecting = -1;
+ if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+ if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0);
+
+ if (numpossible)
+ for (j = 0; j < numpossible; j++) {
+ if (possible[j] >= 0 && possible[j] < TriangleNum) {
+ intersecting = LineFacetd(p1, p2, &vertex[Triangles[possible[j]].vertex[0]], &vertex[Triangles[possible[j]].vertex[1]], &vertex[Triangles[possible[j]].vertex[2]], &facenormals[possible[j]], &point);
+ distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z);
+ if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+ olddistance = distance;
+ firstintersecting = possible[j];
+ }
+ }
+ }
+
+ if (firstintersecting > 0) {
+ distance = abs((facenormals[firstintersecting].x * p2->x) + (facenormals[firstintersecting].y * p2->y) + (facenormals[firstintersecting].z * p2->z) - ((facenormals[firstintersecting].x * vertex[Triangles[firstintersecting].vertex[0]].x) + (facenormals[firstintersecting].y * vertex[Triangles[firstintersecting].vertex[0]].y) + (facenormals[firstintersecting].z * vertex[Triangles[firstintersecting].vertex[0]].z)));
+ *p2 -= facenormals[firstintersecting] * distance;
+ }
+
+ if (*rotate)*p2 = DoRotation(*p2, 0, *rotate, 0);
+ *p2 = *p2 + *move;
+ return firstintersecting;
}
-int Model::SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate)
+int Model::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate)
{
- static int i,j;
- static float distance;
- static float olddistance;
- static int intersecting;
- static int firstintersecting;
- static XYZ point;
- static XYZ oldp1;
- static XYZ start,end;
-
- firstintersecting=-1;
-
- oldp1=*p1;
- *p1=*p1-*move;
- if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
- if(distsq(p1,&boundingspherecenter)>radius*radius+boundingsphereradius*boundingsphereradius)return -1;
-
- for(i=0;i<4;i++){
- for (j=0;j<TriangleNum;j++){
- intersecting=0;
- distance=abs((facenormals[j].x*p1->x)+(facenormals[j].y*p1->y)+(facenormals[j].z*p1->z)-((facenormals[j].x*vertex[Triangles[j].vertex[0]].x)+(facenormals[j].y*vertex[Triangles[j].vertex[0]].y)+(facenormals[j].z*vertex[Triangles[j].vertex[0]].z)));
- if(distance<radius){
- point=*p1-facenormals[j]*distance;
- if(PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting=1;
- if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
- &vertex[Triangles[j].vertex[1]],
- p1, &radius);
- if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[1]],
- &vertex[Triangles[j].vertex[2]],
- p1, &radius);
- if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
- &vertex[Triangles[j].vertex[2]],
- p1, &radius);
- if(intersecting){
- *p1+=facenormals[j]*(distance-radius);
- /*start=*p1;
- end=*p1;
- end.y-=radius;
- if(LineFacetd(&start,&end,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point)){
- p1->y=point.y+radius;
- }*/
- }
- }
- if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j; *p=point;}
- }
- }
- if(*rotate)*p=DoRotation(*p,0,*rotate,0);
- *p=*p+*move;
- if(*rotate)*p1=DoRotation(*p1,0,*rotate,0);
- *p1+=*move;
- return firstintersecting;
+ static int i, j;
+ static float distance;
+ static float olddistance;
+ static int intersecting;
+ static int firstintersecting;
+ static XYZ point;
+ static XYZ oldp1;
+ static XYZ start, end;
+
+ firstintersecting = -1;
+
+ oldp1 = *p1;
+ *p1 = *p1 - *move;
+ if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+ if (distsq(p1, &boundingspherecenter) > radius * radius + boundingsphereradius * boundingsphereradius)return -1;
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < TriangleNum; j++) {
+ intersecting = 0;
+ distance = abs((facenormals[j].x * p1->x) + (facenormals[j].y * p1->y) + (facenormals[j].z * p1->z) - ((facenormals[j].x * vertex[Triangles[j].vertex[0]].x) + (facenormals[j].y * vertex[Triangles[j].vertex[0]].y) + (facenormals[j].z * vertex[Triangles[j].vertex[0]].z)));
+ if (distance < radius) {
+ point = *p1 - facenormals[j] * distance;
+ if (PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting = 1;
+ if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
+ &vertex[Triangles[j].vertex[1]],
+ p1, &radius);
+ if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[1]],
+ &vertex[Triangles[j].vertex[2]],
+ p1, &radius);
+ if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
+ &vertex[Triangles[j].vertex[2]],
+ p1, &radius);
+ if (intersecting) {
+ *p1 += facenormals[j] * (distance - radius);
+ /*start=*p1;
+ end=*p1;
+ end.y-=radius;
+ if(LineFacetd(&start,&end,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point)){
+ p1->y=point.y+radius;
+ }*/
+ }
+ }
+ if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+ olddistance = distance;
+ firstintersecting = j;
+ *p = point;
+ }
+ }
+ }
+ if (*rotate)*p = DoRotation(*p, 0, *rotate, 0);
+ *p = *p + *move;
+ if (*rotate)*p1 = DoRotation(*p1, 0, *rotate, 0);
+ *p1 += *move;
+ return firstintersecting;
}
-int Model::SphereCheckPossible(XYZ *p1,float radius, XYZ *move, float *rotate)
+int Model::SphereCheckPossible(XYZ *p1, float radius, XYZ *move, float *rotate)
{
- static int i,j;
- static float distance;
- static float olddistance;
- static int intersecting;
- static int firstintersecting;
- static XYZ point;
- static XYZ oldp1;
- static XYZ start,end;
-
- firstintersecting=-1;
-
- oldp1=*p1;
- *p1=*p1-*move;
-
- numpossible=0;
-
- if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
- if(distsq(p1,&boundingspherecenter)>radius*radius+boundingsphereradius*boundingsphereradius){*p1=oldp1; return -1;}
-
- for (j=0;j<TriangleNum;j++){
- intersecting=0;
- distance=abs((facenormals[j].x*p1->x)+(facenormals[j].y*p1->y)+(facenormals[j].z*p1->z)-((facenormals[j].x*vertex[Triangles[j].vertex[0]].x)+(facenormals[j].y*vertex[Triangles[j].vertex[0]].y)+(facenormals[j].z*vertex[Triangles[j].vertex[0]].z)));
- if(distance<radius){
- point=*p1-facenormals[j]*distance;
- if(PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting=1;
- if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
- &vertex[Triangles[j].vertex[1]],
- p1, &radius);
- if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[1]],
- &vertex[Triangles[j].vertex[2]],
- p1, &radius);
- if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
- &vertex[Triangles[j].vertex[2]],
- p1, &radius);
- if(intersecting){
- //if(j>=0&&j<TriangleNum)
- possible[numpossible]=j;
- numpossible++;
- }
- }
- if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j;}
- }
- if(*rotate)*p1=DoRotation(*p1,0,*rotate,0);
- *p1+=*move;
- return firstintersecting;
+ static int i, j;
+ static float distance;
+ static float olddistance;
+ static int intersecting;
+ static int firstintersecting;
+ static XYZ point;
+ static XYZ oldp1;
+ static XYZ start, end;
+
+ firstintersecting = -1;
+
+ oldp1 = *p1;
+ *p1 = *p1 - *move;
+
+ numpossible = 0;
+
+ if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+ if (distsq(p1, &boundingspherecenter) > radius * radius + boundingsphereradius * boundingsphereradius) {
+ *p1 = oldp1;
+ return -1;
+ }
+
+ for (j = 0; j < TriangleNum; j++) {
+ intersecting = 0;
+ distance = abs((facenormals[j].x * p1->x) + (facenormals[j].y * p1->y) + (facenormals[j].z * p1->z) - ((facenormals[j].x * vertex[Triangles[j].vertex[0]].x) + (facenormals[j].y * vertex[Triangles[j].vertex[0]].y) + (facenormals[j].z * vertex[Triangles[j].vertex[0]].z)));
+ if (distance < radius) {
+ point = *p1 - facenormals[j] * distance;
+ if (PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting = 1;
+ if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
+ &vertex[Triangles[j].vertex[1]],
+ p1, &radius);
+ if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[1]],
+ &vertex[Triangles[j].vertex[2]],
+ p1, &radius);
+ if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
+ &vertex[Triangles[j].vertex[2]],
+ p1, &radius);
+ if (intersecting) {
+ //if(j>=0&&j<TriangleNum)
+ possible[numpossible] = j;
+ numpossible++;
+ }
+ }
+ if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+ olddistance = distance;
+ firstintersecting = j;
+ }
+ }
+ if (*rotate)*p1 = DoRotation(*p1, 0, *rotate, 0);
+ *p1 += *move;
+ return firstintersecting;
}
-void Model::UpdateVertexArray(){
- if(type!=normaltype&&type!=decalstype)return;
- static int i;
- static int j;
- if(!flat)
- for(i=0;i<TriangleNum;i++){
- j=i*24;
- vArray[j+0]=Triangles[i].gx[0];
- vArray[j+1]=Triangles[i].gy[0];
- vArray[j+2]=normals[Triangles[i].vertex[0]].x;
- vArray[j+3]=normals[Triangles[i].vertex[0]].y;
- vArray[j+4]=normals[Triangles[i].vertex[0]].z;
- vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
- vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
- vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
- vArray[j+8]=Triangles[i].gx[1];
- vArray[j+9]=Triangles[i].gy[1];
- vArray[j+10]=normals[Triangles[i].vertex[1]].x;
- vArray[j+11]=normals[Triangles[i].vertex[1]].y;
- vArray[j+12]=normals[Triangles[i].vertex[1]].z;
- vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
- vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
- vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
- vArray[j+16]=Triangles[i].gx[2];
- vArray[j+17]=Triangles[i].gy[2];
- vArray[j+18]=normals[Triangles[i].vertex[2]].x;
- vArray[j+19]=normals[Triangles[i].vertex[2]].y;
- vArray[j+20]=normals[Triangles[i].vertex[2]].z;
- vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
- vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
- vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
- }
- if(flat)
- for(i=0;i<TriangleNum;i++){
- j=i*24;
- vArray[j+0]=Triangles[i].gx[0];
- vArray[j+1]=Triangles[i].gy[0];
- vArray[j+2]=facenormals[i].x*-1;
- vArray[j+3]=facenormals[i].y*-1;
- vArray[j+4]=facenormals[i].z*-1;
- vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
- vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
- vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
- vArray[j+8]=Triangles[i].gx[1];
- vArray[j+9]=Triangles[i].gy[1];
- vArray[j+10]=facenormals[i].x*-1;
- vArray[j+11]=facenormals[i].y*-1;
- vArray[j+12]=facenormals[i].z*-1;
- vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
- vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
- vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
- vArray[j+16]=Triangles[i].gx[2];
- vArray[j+17]=Triangles[i].gy[2];
- vArray[j+18]=facenormals[i].x*-1;
- vArray[j+19]=facenormals[i].y*-1;
- vArray[j+20]=facenormals[i].z*-1;
- vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
- vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
- vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
-
- }
+void Model::UpdateVertexArray()
+{
+ if (type != normaltype && type != decalstype)return;
+ static int i;
+ static int j;
+ if (!flat)
+ for (i = 0; i < TriangleNum; i++) {
+ j = i * 24;
+ vArray[j + 0] = Triangles[i].gx[0];
+ vArray[j + 1] = Triangles[i].gy[0];
+ vArray[j + 2] = normals[Triangles[i].vertex[0]].x;
+ vArray[j + 3] = normals[Triangles[i].vertex[0]].y;
+ vArray[j + 4] = normals[Triangles[i].vertex[0]].z;
+ vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+ vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+ vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+ vArray[j + 8] = Triangles[i].gx[1];
+ vArray[j + 9] = Triangles[i].gy[1];
+ vArray[j + 10] = normals[Triangles[i].vertex[1]].x;
+ vArray[j + 11] = normals[Triangles[i].vertex[1]].y;
+ vArray[j + 12] = normals[Triangles[i].vertex[1]].z;
+ vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+ vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+ vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+ vArray[j + 16] = Triangles[i].gx[2];
+ vArray[j + 17] = Triangles[i].gy[2];
+ vArray[j + 18] = normals[Triangles[i].vertex[2]].x;
+ vArray[j + 19] = normals[Triangles[i].vertex[2]].y;
+ vArray[j + 20] = normals[Triangles[i].vertex[2]].z;
+ vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+ vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+ vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+ }
+ if (flat)
+ for (i = 0; i < TriangleNum; i++) {
+ j = i * 24;
+ vArray[j + 0] = Triangles[i].gx[0];
+ vArray[j + 1] = Triangles[i].gy[0];
+ vArray[j + 2] = facenormals[i].x * -1;
+ vArray[j + 3] = facenormals[i].y * -1;
+ vArray[j + 4] = facenormals[i].z * -1;
+ vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+ vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+ vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+ vArray[j + 8] = Triangles[i].gx[1];
+ vArray[j + 9] = Triangles[i].gy[1];
+ vArray[j + 10] = facenormals[i].x * -1;
+ vArray[j + 11] = facenormals[i].y * -1;
+ vArray[j + 12] = facenormals[i].z * -1;
+ vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+ vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+ vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+ vArray[j + 16] = Triangles[i].gx[2];
+ vArray[j + 17] = Triangles[i].gy[2];
+ vArray[j + 18] = facenormals[i].x * -1;
+ vArray[j + 19] = facenormals[i].y * -1;
+ vArray[j + 20] = facenormals[i].z * -1;
+ vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+ vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+ vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+
+ }
}
-void Model::UpdateVertexArrayNoTex(){
- if(type!=normaltype&&type!=decalstype)return;
- static int i;
- static int j;
- if(!flat)
- for(i=0;i<TriangleNum;i++){
- j=i*24;
- vArray[j+2]=normals[Triangles[i].vertex[0]].x;
- vArray[j+3]=normals[Triangles[i].vertex[0]].y;
- vArray[j+4]=normals[Triangles[i].vertex[0]].z;
- vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
- vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
- vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
- vArray[j+10]=normals[Triangles[i].vertex[1]].x;
- vArray[j+11]=normals[Triangles[i].vertex[1]].y;
- vArray[j+12]=normals[Triangles[i].vertex[1]].z;
- vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
- vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
- vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
- vArray[j+18]=normals[Triangles[i].vertex[2]].x;
- vArray[j+19]=normals[Triangles[i].vertex[2]].y;
- vArray[j+20]=normals[Triangles[i].vertex[2]].z;
- vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
- vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
- vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
- }
- if(flat)
- for(i=0;i<TriangleNum;i++){
- j=i*24;
- vArray[j+2]=facenormals[i].x*-1;
- vArray[j+3]=facenormals[i].y*-1;
- vArray[j+4]=facenormals[i].z*-1;
- vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
- vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
- vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
- vArray[j+10]=facenormals[i].x*-1;
- vArray[j+11]=facenormals[i].y*-1;
- vArray[j+12]=facenormals[i].z*-1;
- vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
- vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
- vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
- vArray[j+18]=facenormals[i].x*-1;
- vArray[j+19]=facenormals[i].y*-1;
- vArray[j+20]=facenormals[i].z*-1;
- vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
- vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
- vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
- }
+void Model::UpdateVertexArrayNoTex()
+{
+ if (type != normaltype && type != decalstype)return;
+ static int i;
+ static int j;
+ if (!flat)
+ for (i = 0; i < TriangleNum; i++) {
+ j = i * 24;
+ vArray[j + 2] = normals[Triangles[i].vertex[0]].x;
+ vArray[j + 3] = normals[Triangles[i].vertex[0]].y;
+ vArray[j + 4] = normals[Triangles[i].vertex[0]].z;
+ vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+ vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+ vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+ vArray[j + 10] = normals[Triangles[i].vertex[1]].x;
+ vArray[j + 11] = normals[Triangles[i].vertex[1]].y;
+ vArray[j + 12] = normals[Triangles[i].vertex[1]].z;
+ vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+ vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+ vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+ vArray[j + 18] = normals[Triangles[i].vertex[2]].x;
+ vArray[j + 19] = normals[Triangles[i].vertex[2]].y;
+ vArray[j + 20] = normals[Triangles[i].vertex[2]].z;
+ vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+ vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+ vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+ }
+ if (flat)
+ for (i = 0; i < TriangleNum; i++) {
+ j = i * 24;
+ vArray[j + 2] = facenormals[i].x * -1;
+ vArray[j + 3] = facenormals[i].y * -1;
+ vArray[j + 4] = facenormals[i].z * -1;
+ vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+ vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+ vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+ vArray[j + 10] = facenormals[i].x * -1;
+ vArray[j + 11] = facenormals[i].y * -1;
+ vArray[j + 12] = facenormals[i].z * -1;
+ vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+ vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+ vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+ vArray[j + 18] = facenormals[i].x * -1;
+ vArray[j + 19] = facenormals[i].y * -1;
+ vArray[j + 20] = facenormals[i].z * -1;
+ vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+ vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+ vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+ }
}
-void Model::UpdateVertexArrayNoTexNoNorm(){
- if(type!=normaltype&&type!=decalstype)return;
- static int i;
- static int j;
- for(i=0;i<TriangleNum;i++){
- j=i*24;
- vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
- vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
- vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
- vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
- vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
- vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
- vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
- vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
- vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
- }
+void Model::UpdateVertexArrayNoTexNoNorm()
+{
+ if (type != normaltype && type != decalstype)return;
+ static int i;
+ static int j;
+ for (i = 0; i < TriangleNum; i++) {
+ j = i * 24;
+ vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+ vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+ vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+ vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+ vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+ vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+ vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+ vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+ vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+ }
}
bool Model::loadnotex(const char *filename )
{
- FILE *tfile;
- long i;
-
- int oldvertexNum,oldTriangleNum;
- oldvertexNum=vertexNum;
- oldTriangleNum=TriangleNum;
-
- type=notextype;
- color=0;
-
- tfile=fopen( ConvertFileName(filename), "rb" );
- // read model settings
-
- fseek(tfile, 0, SEEK_SET);
- funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
-
- // read the model data
- deallocate();
-
- numpossible=0;
-
- owner = (int*)malloc(sizeof(int)*vertexNum);
- possible = (int*)malloc(sizeof(int)*TriangleNum);
- vertex = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
- Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle)*TriangleNum);
- vArray = (GLfloat*)malloc(sizeof(GLfloat)*TriangleNum*24);
-
- for(i=0;i<vertexNum;i++){
- funpackf(tfile, "Bf Bf Bf", &vertex[i].x,&vertex[i].y,&vertex[i].z);
- }
-
- for(i=0;i<TriangleNum;i++){
- // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
- short vertex[ 6];
- funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
- Triangles[i].vertex[ 0] = vertex[ 0];
- Triangles[i].vertex[ 1] = vertex[ 2];
- Triangles[i].vertex[ 2] = vertex[ 4];
- funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
- funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
- }
-
- fclose(tfile);
-
- UpdateVertexArray();
-
- for(i=0;i<vertexNum;i++){
- owner[i]=-1;
- }
-
- static int j;
- boundingsphereradius=0;
- for(i=0;i<vertexNum;i++){
- for(j=0;j<vertexNum;j++){
- if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
- boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
- boundingspherecenter=(vertex[i]+vertex[j])/2;
- }
- }
- }
- boundingsphereradius=fast_sqrt(boundingsphereradius);
-
- return 1;
+ FILE *tfile;
+ long i;
+
+ int oldvertexNum, oldTriangleNum;
+ oldvertexNum = vertexNum;
+ oldTriangleNum = TriangleNum;
+
+ type = notextype;
+ color = 0;
+
+ tfile = fopen( ConvertFileName(filename), "rb" );
+ // read model settings
+
+ fseek(tfile, 0, SEEK_SET);
+ funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
+
+ // read the model data
+ deallocate();
+
+ numpossible = 0;
+
+ owner = (int*)malloc(sizeof(int) * vertexNum);
+ possible = (int*)malloc(sizeof(int) * TriangleNum);
+ vertex = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+ Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle) * TriangleNum);
+ vArray = (GLfloat*)malloc(sizeof(GLfloat) * TriangleNum * 24);
+
+ for (i = 0; i < vertexNum; i++) {
+ funpackf(tfile, "Bf Bf Bf", &vertex[i].x, &vertex[i].y, &vertex[i].z);
+ }
+
+ for (i = 0; i < TriangleNum; i++) {
+ // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
+ short vertex[ 6];
+ funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
+ Triangles[i].vertex[ 0] = vertex[ 0];
+ Triangles[i].vertex[ 1] = vertex[ 2];
+ Triangles[i].vertex[ 2] = vertex[ 4];
+ funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
+ funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
+ }
+
+ fclose(tfile);
+
+ UpdateVertexArray();
+
+ for (i = 0; i < vertexNum; i++) {
+ owner[i] = -1;
+ }
+
+ static int j;
+ boundingsphereradius = 0;
+ for (i = 0; i < vertexNum; i++) {
+ for (j = 0; j < vertexNum; j++) {
+ if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+ boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+ boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+ }
+ }
+ }
+ boundingsphereradius = fast_sqrt(boundingsphereradius);
+
+ return 1;
}
-bool Model::load(const char *filename,bool texture )
+bool Model::load(const char *filename, bool texture )
{
- FILE *tfile;
- long i;
+ FILE *tfile;
+ long i;
- LOGFUNC;
+ LOGFUNC;
- LOG(std::string("Loading model...") + filename);
+ LOG(std::string("Loading model...") + filename);
- if(visibleloading)
- Game::LoadingScreen();
+ if (visibleloading)
+ Game::LoadingScreen();
- int oldvertexNum,oldTriangleNum;
- oldvertexNum=vertexNum;
- oldTriangleNum=TriangleNum;
+ int oldvertexNum, oldTriangleNum;
+ oldvertexNum = vertexNum;
+ oldTriangleNum = TriangleNum;
- type = normaltype;
- color=0;
+ type = normaltype;
+ color = 0;
- tfile=fopen( ConvertFileName(filename), "rb" );
- // read model settings
+ tfile = fopen( ConvertFileName(filename), "rb" );
+ // read model settings
- fseek(tfile, 0, SEEK_SET);
- funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
+ fseek(tfile, 0, SEEK_SET);
+ funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
- // read the model data
- deallocate();
+ // read the model data
+ deallocate();
- numpossible=0;
+ numpossible = 0;
- owner = (int*)malloc(sizeof(int)*vertexNum);
- possible = (int*)malloc(sizeof(int)*TriangleNum);
- vertex = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
- normals = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
- facenormals = (XYZ*)malloc(sizeof(XYZ)*TriangleNum);
- Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle)*TriangleNum);
- vArray = (GLfloat*)malloc(sizeof(GLfloat)*TriangleNum*24);
+ owner = (int*)malloc(sizeof(int) * vertexNum);
+ possible = (int*)malloc(sizeof(int) * TriangleNum);
+ vertex = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+ normals = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+ facenormals = (XYZ*)malloc(sizeof(XYZ) * TriangleNum);
+ Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle) * TriangleNum);
+ vArray = (GLfloat*)malloc(sizeof(GLfloat) * TriangleNum * 24);
- for(i=0;i<vertexNum;i++){
- funpackf(tfile, "Bf Bf Bf", &vertex[i].x,&vertex[i].y,&vertex[i].z);
- }
+ for (i = 0; i < vertexNum; i++) {
+ funpackf(tfile, "Bf Bf Bf", &vertex[i].x, &vertex[i].y, &vertex[i].z);
+ }
- for(i=0;i<TriangleNum;i++){
- // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
- short vertex[ 6];
- funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
- Triangles[i].vertex[ 0] = vertex[ 0];
- Triangles[i].vertex[ 1] = vertex[ 2];
- Triangles[i].vertex[ 2] = vertex[ 4];
- funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
- funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
- }
+ for (i = 0; i < TriangleNum; i++) {
+ // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
+ short vertex[ 6];
+ funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
+ Triangles[i].vertex[ 0] = vertex[ 0];
+ Triangles[i].vertex[ 1] = vertex[ 2];
+ Triangles[i].vertex[ 2] = vertex[ 4];
+ funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
+ funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
+ }
- modelTexture.xsz=0;
+ modelTexture.xsz = 0;
- fclose(tfile);
+ fclose(tfile);
- UpdateVertexArray();
+ UpdateVertexArray();
- for(i=0;i<vertexNum;i++){
- owner[i]=-1;
- }
+ for (i = 0; i < vertexNum; i++) {
+ owner[i] = -1;
+ }
- static int j;
- boundingsphereradius=0;
- for(i=0;i<vertexNum;i++){
- for(j=0;j<vertexNum;j++){
- if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
- boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
- boundingspherecenter=(vertex[i]+vertex[j])/2;
- }
- }
- }
- boundingsphereradius=fast_sqrt(boundingsphereradius);
+ static int j;
+ boundingsphereradius = 0;
+ for (i = 0; i < vertexNum; i++) {
+ for (j = 0; j < vertexNum; j++) {
+ if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+ boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+ boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+ }
+ }
+ }
+ boundingsphereradius = fast_sqrt(boundingsphereradius);
- return 1;
+ return 1;
}
-bool Model::loaddecal(const char *filename,bool texture )
+bool Model::loaddecal(const char *filename, bool texture )
{
- FILE *tfile;
- long i,j;
-
- LOGFUNC;
-
- // Changing the filename so that its more os specific
- char * FixedFN = ConvertFileName(filename);
-
- LOG(std::string("Loading decal...") + FixedFN);
-
- int oldvertexNum,oldTriangleNum;
- oldvertexNum=vertexNum;
- oldTriangleNum=TriangleNum;
-
- type = decalstype;
- numdecals=0;
- color=0;
-
- tfile=fopen( FixedFN, "rb" );
- // read model settings
-
-
- fseek(tfile, 0, SEEK_SET);
- funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
-
- // read the model data
-
- deallocate();
-
- numpossible=0;
-
- owner = (int*)malloc(sizeof(int)*vertexNum);
- possible = (int*)malloc(sizeof(int)*TriangleNum);
- vertex = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
- normals = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
- facenormals = (XYZ*)malloc(sizeof(XYZ)*TriangleNum);
- Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle)*TriangleNum);
- vArray = (GLfloat*)malloc(sizeof(GLfloat)*TriangleNum*24);
-
-
- for(i=0;i<vertexNum;i++){
- funpackf(tfile, "Bf Bf Bf", &vertex[i].x,&vertex[i].y,&vertex[i].z);
- }
-
- for(i=0;i<TriangleNum;i++){
- // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
- short vertex[ 6];
- funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
- Triangles[i].vertex[ 0] = vertex[ 0];
- Triangles[i].vertex[ 1] = vertex[ 2];
- Triangles[i].vertex[ 2] = vertex[ 4];
- funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
- funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
- }
-
-
- modelTexture.xsz=0;
-
- fclose(tfile);
-
- UpdateVertexArray();
-
- for(i=0;i<vertexNum;i++){
- owner[i]=-1;
- }
-
- boundingsphereradius=0;
- for(i=0;i<vertexNum;i++){
- for(j=0;j<vertexNum;j++){
- if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
- boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
- boundingspherecenter=(vertex[i]+vertex[j])/2;
- }
- }
- }
- boundingsphereradius=fast_sqrt(boundingsphereradius);
-
- //allow decals
- if(!decaltexcoords){
- decaltexcoords = (float***)malloc(sizeof(float**)*max_model_decals);
- for(i=0;i<max_model_decals;i++){
- decaltexcoords[i] = (float**)malloc(sizeof(float*)*3);
- for(j=0;j<3;j++){
- decaltexcoords[i][j] = (float*)malloc(sizeof(float)*2);
- }
- }
- //if(decalvertex)free(decalvertex);
- decalvertex = (XYZ**)malloc(sizeof(XYZ*)*max_model_decals);
- for(i=0;i<max_model_decals;i++){
- decalvertex[i] = (XYZ*)malloc(sizeof(XYZ)*3);
- }
-
- decaltype = (int*)malloc(sizeof(int)*max_model_decals);
- decalopacity = (float*)malloc(sizeof(float)*max_model_decals);
- decalrotation = (float*)malloc(sizeof(float)*max_model_decals);
- decalalivetime = (float*)malloc(sizeof(float)*max_model_decals);
- decalposition = (XYZ*)malloc(sizeof(XYZ)*max_model_decals);
- }
-
- return 1;
+ FILE *tfile;
+ long i, j;
+
+ LOGFUNC;
+
+ // Changing the filename so that its more os specific
+ char * FixedFN = ConvertFileName(filename);
+
+ LOG(std::string("Loading decal...") + FixedFN);
+
+ int oldvertexNum, oldTriangleNum;
+ oldvertexNum = vertexNum;
+ oldTriangleNum = TriangleNum;
+
+ type = decalstype;
+ numdecals = 0;
+ color = 0;
+
+ tfile = fopen( FixedFN, "rb" );
+ // read model settings
+
+
+ fseek(tfile, 0, SEEK_SET);
+ funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
+
+ // read the model data
+
+ deallocate();
+
+ numpossible = 0;
+
+ owner = (int*)malloc(sizeof(int) * vertexNum);
+ possible = (int*)malloc(sizeof(int) * TriangleNum);
+ vertex = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+ normals = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+ facenormals = (XYZ*)malloc(sizeof(XYZ) * TriangleNum);
+ Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle) * TriangleNum);
+ vArray = (GLfloat*)malloc(sizeof(GLfloat) * TriangleNum * 24);
+
+
+ for (i = 0; i < vertexNum; i++) {
+ funpackf(tfile, "Bf Bf Bf", &vertex[i].x, &vertex[i].y, &vertex[i].z);
+ }
+
+ for (i = 0; i < TriangleNum; i++) {
+ // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
+ short vertex[ 6];
+ funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
+ Triangles[i].vertex[ 0] = vertex[ 0];
+ Triangles[i].vertex[ 1] = vertex[ 2];
+ Triangles[i].vertex[ 2] = vertex[ 4];
+ funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
+ funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
+ }
+
+
+ modelTexture.xsz = 0;
+
+ fclose(tfile);
+
+ UpdateVertexArray();
+
+ for (i = 0; i < vertexNum; i++) {
+ owner[i] = -1;
+ }
+
+ boundingsphereradius = 0;
+ for (i = 0; i < vertexNum; i++) {
+ for (j = 0; j < vertexNum; j++) {
+ if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+ boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+ boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+ }
+ }
+ }
+ boundingsphereradius = fast_sqrt(boundingsphereradius);
+
+ //allow decals
+ if (!decaltexcoords) {
+ decaltexcoords = (float***)malloc(sizeof(float**)*max_model_decals);
+ for (i = 0; i < max_model_decals; i++) {
+ decaltexcoords[i] = (float**)malloc(sizeof(float*) * 3);
+ for (j = 0; j < 3; j++) {
+ decaltexcoords[i][j] = (float*)malloc(sizeof(float) * 2);
+ }
+ }
+ //if(decalvertex)free(decalvertex);
+ decalvertex = (XYZ**)malloc(sizeof(XYZ*)*max_model_decals);
+ for (i = 0; i < max_model_decals; i++) {
+ decalvertex[i] = (XYZ*)malloc(sizeof(XYZ) * 3);
+ }
+
+ decaltype = (int*)malloc(sizeof(int) * max_model_decals);
+ decalopacity = (float*)malloc(sizeof(float) * max_model_decals);
+ decalrotation = (float*)malloc(sizeof(float) * max_model_decals);
+ decalalivetime = (float*)malloc(sizeof(float) * max_model_decals);
+ decalposition = (XYZ*)malloc(sizeof(XYZ) * max_model_decals);
+ }
+
+ return 1;
}
bool Model::loadraw(char *filename )
{
- FILE *tfile;
- long i;
+ FILE *tfile;
+ long i;
- LOGFUNC;
+ LOGFUNC;
- LOG(std::string("Loading raw...") + filename);
+ LOG(std::string("Loading raw...") + filename);
- int oldvertexNum,oldTriangleNum;
- oldvertexNum=vertexNum;
- oldTriangleNum=TriangleNum;
+ int oldvertexNum, oldTriangleNum;
+ oldvertexNum = vertexNum;
+ oldTriangleNum = TriangleNum;
- type = rawtype;
- color=0;
+ type = rawtype;
+ color = 0;
- tfile=fopen( ConvertFileName(filename), "rb" );
- // read model settings
+ tfile = fopen( ConvertFileName(filename), "rb" );
+ // read model settings
- fseek(tfile, 0, SEEK_SET);
- funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
+ fseek(tfile, 0, SEEK_SET);
+ funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
- // read the model data
- deallocate();
+ // read the model data
+ deallocate();
- numpossible=0;
+ numpossible = 0;
- owner = (int*)malloc(sizeof(int)*vertexNum);
- possible = (int*)malloc(sizeof(int)*TriangleNum);
- vertex = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
- Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle)*TriangleNum);
- vArray = (GLfloat*)malloc(sizeof(GLfloat)*TriangleNum*24);
+ owner = (int*)malloc(sizeof(int) * vertexNum);
+ possible = (int*)malloc(sizeof(int) * TriangleNum);
+ vertex = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+ Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle) * TriangleNum);
+ vArray = (GLfloat*)malloc(sizeof(GLfloat) * TriangleNum * 24);
- for(i=0;i<vertexNum;i++){
- funpackf(tfile, "Bf Bf Bf", &vertex[i].x,&vertex[i].y,&vertex[i].z);
- }
+ for (i = 0; i < vertexNum; i++) {
+ funpackf(tfile, "Bf Bf Bf", &vertex[i].x, &vertex[i].y, &vertex[i].z);
+ }
- for(i=0;i<TriangleNum;i++){
- // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
- short vertex[ 6];
- funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
- Triangles[i].vertex[ 0] = vertex[ 0];
- Triangles[i].vertex[ 1] = vertex[ 2];
- Triangles[i].vertex[ 2] = vertex[ 4];
- funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
- funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
- }
+ for (i = 0; i < TriangleNum; i++) {
+ // funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
+ short vertex[ 6];
+ funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
+ Triangles[i].vertex[ 0] = vertex[ 0];
+ Triangles[i].vertex[ 1] = vertex[ 2];
+ Triangles[i].vertex[ 2] = vertex[ 4];
+ funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
+ funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
+ }
- fclose(tfile);
+ fclose(tfile);
- for(i=0;i<vertexNum;i++){
- owner[i]=-1;
- }
+ for (i = 0; i < vertexNum; i++) {
+ owner[i] = -1;
+ }
- return 1;
+ return 1;
}
void Model::UniformTexCoords()
{
- static int i;
- for(i=0; i<TriangleNum; i++){
- Triangles[i].gy[0]=vertex[Triangles[i].vertex[0]].y;
- Triangles[i].gy[1]=vertex[Triangles[i].vertex[1]].y;
- Triangles[i].gy[2]=vertex[Triangles[i].vertex[2]].y;
- Triangles[i].gx[0]=vertex[Triangles[i].vertex[0]].x;
- Triangles[i].gx[1]=vertex[Triangles[i].vertex[1]].x;
- Triangles[i].gx[2]=vertex[Triangles[i].vertex[2]].x;
- }
- UpdateVertexArray();
+ static int i;
+ for (i = 0; i < TriangleNum; i++) {
+ Triangles[i].gy[0] = vertex[Triangles[i].vertex[0]].y;
+ Triangles[i].gy[1] = vertex[Triangles[i].vertex[1]].y;
+ Triangles[i].gy[2] = vertex[Triangles[i].vertex[2]].y;
+ Triangles[i].gx[0] = vertex[Triangles[i].vertex[0]].x;
+ Triangles[i].gx[1] = vertex[Triangles[i].vertex[1]].x;
+ Triangles[i].gx[2] = vertex[Triangles[i].vertex[2]].x;
+ }
+ UpdateVertexArray();
}
void Model::FlipTexCoords()
{
- static int i;
- for(i=0; i<TriangleNum; i++){
- Triangles[i].gy[0]=-Triangles[i].gy[0];
- Triangles[i].gy[1]=-Triangles[i].gy[1];
- Triangles[i].gy[2]=-Triangles[i].gy[2];
- }
- UpdateVertexArray();
+ static int i;
+ for (i = 0; i < TriangleNum; i++) {
+ Triangles[i].gy[0] = -Triangles[i].gy[0];
+ Triangles[i].gy[1] = -Triangles[i].gy[1];
+ Triangles[i].gy[2] = -Triangles[i].gy[2];
+ }
+ UpdateVertexArray();
}
void Model::ScaleTexCoords(float howmuch)
{
- static int i;
- for(i=0; i<TriangleNum; i++){
- Triangles[i].gx[0]*=howmuch;
- Triangles[i].gx[1]*=howmuch;
- Triangles[i].gx[2]*=howmuch;
- Triangles[i].gy[0]*=howmuch;
- Triangles[i].gy[1]*=howmuch;
- Triangles[i].gy[2]*=howmuch;
- }
- UpdateVertexArray();
+ static int i;
+ for (i = 0; i < TriangleNum; i++) {
+ Triangles[i].gx[0] *= howmuch;
+ Triangles[i].gx[1] *= howmuch;
+ Triangles[i].gx[2] *= howmuch;
+ Triangles[i].gy[0] *= howmuch;
+ Triangles[i].gy[1] *= howmuch;
+ Triangles[i].gy[2] *= howmuch;
+ }
+ UpdateVertexArray();
}
-void Model::Scale(float xscale,float yscale,float zscale)
+void Model::Scale(float xscale, float yscale, float zscale)
{
- static int i;
- for(i=0; i<vertexNum; i++){
- vertex[i].x*=xscale;
- vertex[i].y*=yscale;
- vertex[i].z*=zscale;
- }
- UpdateVertexArray();
-
- static int j;
-
- boundingsphereradius=0;
- for(i=0;i<vertexNum;i++){
- for(j=0;j<vertexNum;j++){
- if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
- boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
- boundingspherecenter=(vertex[i]+vertex[j])/2;
- }
- }
- }
- boundingsphereradius=fast_sqrt(boundingsphereradius);
+ static int i;
+ for (i = 0; i < vertexNum; i++) {
+ vertex[i].x *= xscale;
+ vertex[i].y *= yscale;
+ vertex[i].z *= zscale;
+ }
+ UpdateVertexArray();
+
+ static int j;
+
+ boundingsphereradius = 0;
+ for (i = 0; i < vertexNum; i++) {
+ for (j = 0; j < vertexNum; j++) {
+ if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+ boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+ boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+ }
+ }
+ }
+ boundingsphereradius = fast_sqrt(boundingsphereradius);
}
-void Model::ScaleNormals(float xscale,float yscale,float zscale)
+void Model::ScaleNormals(float xscale, float yscale, float zscale)
{
- if(type!=normaltype&&type!=decalstype)return;
- static int i;
- for(i=0; i<vertexNum; i++){
- normals[i].x*=xscale;
- normals[i].y*=yscale;
- normals[i].z*=zscale;
- }
- for(i=0; i<TriangleNum; i++){
- facenormals[i].x*=xscale;
- facenormals[i].y*=yscale;
- facenormals[i].z*=zscale;
- }
- UpdateVertexArray();
+ if (type != normaltype && type != decalstype)return;
+ static int i;
+ for (i = 0; i < vertexNum; i++) {
+ normals[i].x *= xscale;
+ normals[i].y *= yscale;
+ normals[i].z *= zscale;
+ }
+ for (i = 0; i < TriangleNum; i++) {
+ facenormals[i].x *= xscale;
+ facenormals[i].y *= yscale;
+ facenormals[i].z *= zscale;
+ }
+ UpdateVertexArray();
}
-void Model::Translate(float xtrans,float ytrans,float ztrans)
+void Model::Translate(float xtrans, float ytrans, float ztrans)
{
- static int i;
- for(i=0; i<vertexNum; i++){
- vertex[i].x+=xtrans;
- vertex[i].y+=ytrans;
- vertex[i].z+=ztrans;
- }
- UpdateVertexArray();
-
- static int j;
- boundingsphereradius=0;
- for(i=0;i<vertexNum;i++){
- for(j=0;j<vertexNum;j++){
- if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
- boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
- boundingspherecenter=(vertex[i]+vertex[j])/2;
- }
- }
- }
- boundingsphereradius=fast_sqrt(boundingsphereradius);
+ static int i;
+ for (i = 0; i < vertexNum; i++) {
+ vertex[i].x += xtrans;
+ vertex[i].y += ytrans;
+ vertex[i].z += ztrans;
+ }
+ UpdateVertexArray();
+
+ static int j;
+ boundingsphereradius = 0;
+ for (i = 0; i < vertexNum; i++) {
+ for (j = 0; j < vertexNum; j++) {
+ if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+ boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+ boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+ }
+ }
+ }
+ boundingsphereradius = fast_sqrt(boundingsphereradius);
}
-void Model::Rotate(float xang,float yang,float zang)
+void Model::Rotate(float xang, float yang, float zang)
{
- static int i;
- for(i=0; i<vertexNum; i++){
- vertex[i]=DoRotation(vertex[i],xang,yang,zang);
- }
- UpdateVertexArray();
-
- static int j;
- boundingsphereradius=0;
- for(i=0;i<vertexNum;i++){
- for(j=0;j<vertexNum;j++){
- if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
- boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
- boundingspherecenter=(vertex[i]+vertex[j])/2;
- }
- }
- }
- boundingsphereradius=fast_sqrt(boundingsphereradius);
+ static int i;
+ for (i = 0; i < vertexNum; i++) {
+ vertex[i] = DoRotation(vertex[i], xang, yang, zang);
+ }
+ UpdateVertexArray();
+
+ static int j;
+ boundingsphereradius = 0;
+ for (i = 0; i < vertexNum; i++) {
+ for (j = 0; j < vertexNum; j++) {
+ if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+ boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+ boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+ }
+ }
+ }
+ boundingsphereradius = fast_sqrt(boundingsphereradius);
}
void Model::CalculateNormals(bool facenormalise)
{
- if(visibleloading)
- Game::LoadingScreen();
- static int i;
- if(type!=normaltype&&type!=decalstype)return;
-
- for(i=0; i<vertexNum; i++){
- normals[i].x=0;
- normals[i].y=0;
- normals[i].z=0;
- }
-
- for(i=0;i<TriangleNum;i++){
- CrossProduct(vertex[Triangles[i].vertex[1]]-vertex[Triangles[i].vertex[0]],vertex[Triangles[i].vertex[2]]-vertex[Triangles[i].vertex[0]],&facenormals[i]);
-
- normals[Triangles[i].vertex[0]].x+=facenormals[i].x;
- normals[Triangles[i].vertex[0]].y+=facenormals[i].y;
- normals[Triangles[i].vertex[0]].z+=facenormals[i].z;
-
- normals[Triangles[i].vertex[1]].x+=facenormals[i].x;
- normals[Triangles[i].vertex[1]].y+=facenormals[i].y;
- normals[Triangles[i].vertex[1]].z+=facenormals[i].z;
-
- normals[Triangles[i].vertex[2]].x+=facenormals[i].x;
- normals[Triangles[i].vertex[2]].y+=facenormals[i].y;
- normals[Triangles[i].vertex[2]].z+=facenormals[i].z;
- if(facenormalise)Normalise(&facenormals[i]);
- }
- for(i=0; i<vertexNum; i++){
- Normalise(&normals[i]);
- normals[i]*=-1;
- }
- UpdateVertexArrayNoTex();
+ if (visibleloading)
+ Game::LoadingScreen();
+ static int i;
+ if (type != normaltype && type != decalstype)return;
+
+ for (i = 0; i < vertexNum; i++) {
+ normals[i].x = 0;
+ normals[i].y = 0;
+ normals[i].z = 0;
+ }
+
+ for (i = 0; i < TriangleNum; i++) {
+ CrossProduct(vertex[Triangles[i].vertex[1]] - vertex[Triangles[i].vertex[0]], vertex[Triangles[i].vertex[2]] - vertex[Triangles[i].vertex[0]], &facenormals[i]);
+
+ normals[Triangles[i].vertex[0]].x += facenormals[i].x;
+ normals[Triangles[i].vertex[0]].y += facenormals[i].y;
+ normals[Triangles[i].vertex[0]].z += facenormals[i].z;
+
+ normals[Triangles[i].vertex[1]].x += facenormals[i].x;
+ normals[Triangles[i].vertex[1]].y += facenormals[i].y;
+ normals[Triangles[i].vertex[1]].z += facenormals[i].z;
+
+ normals[Triangles[i].vertex[2]].x += facenormals[i].x;
+ normals[Triangles[i].vertex[2]].y += facenormals[i].y;
+ normals[Triangles[i].vertex[2]].z += facenormals[i].z;
+ if (facenormalise)Normalise(&facenormals[i]);
+ }
+ for (i = 0; i < vertexNum; i++) {
+ Normalise(&normals[i]);
+ normals[i] *= -1;
+ }
+ UpdateVertexArrayNoTex();
}
void Model::drawimmediate()
{
- textureptr.bind();
- glBegin(GL_TRIANGLES);
- for(int i=0;i<TriangleNum;i++){
- /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){
- if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z)
- &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z)
- &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){
- */
- glTexCoord2f(Triangles[i].gx[0],Triangles[i].gy[0]);
- if(color)glColor3f(normals[Triangles[i].vertex[0]].x,normals[Triangles[i].vertex[0]].y,normals[Triangles[i].vertex[0]].z);
- if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[0]].x,normals[Triangles[i].vertex[0]].y,normals[Triangles[i].vertex[0]].z);
- if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
- glVertex3f(vertex[Triangles[i].vertex[0]].x,vertex[Triangles[i].vertex[0]].y,vertex[Triangles[i].vertex[0]].z);
-
- glTexCoord2f(Triangles[i].gx[1],Triangles[i].gy[1]);
- if(color)glColor3f(normals[Triangles[i].vertex[1]].x,normals[Triangles[i].vertex[1]].y,normals[Triangles[i].vertex[1]].z);
- if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[1]].x,normals[Triangles[i].vertex[1]].y,normals[Triangles[i].vertex[1]].z);
- if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
- glVertex3f(vertex[Triangles[i].vertex[1]].x,vertex[Triangles[i].vertex[1]].y,vertex[Triangles[i].vertex[1]].z);
-
- glTexCoord2f(Triangles[i].gx[2],Triangles[i].gy[2]);
- if(color)glColor3f(normals[Triangles[i].vertex[2]].x,normals[Triangles[i].vertex[2]].y,normals[Triangles[i].vertex[2]].z);
- if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[2]].x,normals[Triangles[i].vertex[2]].y,normals[Triangles[i].vertex[2]].z);
- if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
- glVertex3f(vertex[Triangles[i].vertex[2]].x,vertex[Triangles[i].vertex[2]].y,vertex[Triangles[i].vertex[2]].z);
- //}
- //}
- }
- glEnd();
+ textureptr.bind();
+ glBegin(GL_TRIANGLES);
+ for (int i = 0; i < TriangleNum; i++) {
+ /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){
+ if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z)
+ &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z)
+ &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){
+ */
+ glTexCoord2f(Triangles[i].gx[0], Triangles[i].gy[0]);
+ if (color)glColor3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z);
+ if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z);
+ if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+ glVertex3f(vertex[Triangles[i].vertex[0]].x, vertex[Triangles[i].vertex[0]].y, vertex[Triangles[i].vertex[0]].z);
+
+ glTexCoord2f(Triangles[i].gx[1], Triangles[i].gy[1]);
+ if (color)glColor3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z);
+ if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z);
+ if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+ glVertex3f(vertex[Triangles[i].vertex[1]].x, vertex[Triangles[i].vertex[1]].y, vertex[Triangles[i].vertex[1]].z);
+
+ glTexCoord2f(Triangles[i].gx[2], Triangles[i].gy[2]);
+ if (color)glColor3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z);
+ if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z);
+ if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+ glVertex3f(vertex[Triangles[i].vertex[2]].x, vertex[Triangles[i].vertex[2]].y, vertex[Triangles[i].vertex[2]].z);
+ //}
+ //}
+ }
+ glEnd();
}
void Model::draw()
{
- if(type!=normaltype&&type!=decalstype)return;
+ if (type != normaltype && type != decalstype)return;
- glEnableClientState(GL_NORMAL_ARRAY);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- if(!color)glInterleavedArrays( GL_T2F_N3F_V3F,8*sizeof(GLfloat),&vArray[0]);
- if(color)glInterleavedArrays( GL_T2F_C3F_V3F,8*sizeof(GLfloat),&vArray[0]);
- textureptr.bind();
+ if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ textureptr.bind();
#if PLATFORM_MACOSX
- glLockArraysEXT( 0, TriangleNum*3);
+ glLockArraysEXT( 0, TriangleNum * 3);
#endif
- glDrawArrays(GL_TRIANGLES, 0, TriangleNum*3);
+ glDrawArrays(GL_TRIANGLES, 0, TriangleNum * 3);
#if PLATFORM_MACOSX
- glUnlockArraysEXT();
+ glUnlockArraysEXT();
#endif
- if(!color)glDisableClientState(GL_NORMAL_ARRAY);
- if(color)glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- //drawimmediate();
+ if (!color)glDisableClientState(GL_NORMAL_ARRAY);
+ if (color)glDisableClientState(GL_COLOR_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ //drawimmediate();
}
//TODO: phase out in favor of Texture
void Model::drawdifftex(GLuint texture)
{
- glEnableClientState(GL_NORMAL_ARRAY);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- if(!color)glInterleavedArrays( GL_T2F_N3F_V3F,8*sizeof(GLfloat),&vArray[0]);
- if(color)glInterleavedArrays( GL_T2F_C3F_V3F,8*sizeof(GLfloat),&vArray[0]);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
- glBindTexture(GL_TEXTURE_2D,(unsigned long)texture);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ glBindTexture(GL_TEXTURE_2D, (unsigned long)texture);
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
#ifndef WIN32
- glLockArraysEXT( 0, TriangleNum*3);
+ glLockArraysEXT( 0, TriangleNum * 3);
#endif
- glDrawArrays(GL_TRIANGLES, 0, TriangleNum*3);
+ glDrawArrays(GL_TRIANGLES, 0, TriangleNum * 3);
#ifndef WIN32
- glUnlockArraysEXT();
+ glUnlockArraysEXT();
#endif
- if(!color)glDisableClientState(GL_NORMAL_ARRAY);
- if(color)glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- //drawdiffteximmediate(texture);
+ if (!color)glDisableClientState(GL_NORMAL_ARRAY);
+ if (color)glDisableClientState(GL_COLOR_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ //drawdiffteximmediate(texture);
}
void Model::drawdifftex(Texture texture)
{
- glEnableClientState(GL_NORMAL_ARRAY);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- if(!color)glInterleavedArrays( GL_T2F_N3F_V3F,8*sizeof(GLfloat),&vArray[0]);
- if(color)glInterleavedArrays( GL_T2F_C3F_V3F,8*sizeof(GLfloat),&vArray[0]);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+ if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
- texture.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ texture.bind();
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
#ifndef WIN32
- glLockArraysEXT( 0, TriangleNum*3);
+ glLockArraysEXT( 0, TriangleNum * 3);
#endif
- glDrawArrays(GL_TRIANGLES, 0, TriangleNum*3);
+ glDrawArrays(GL_TRIANGLES, 0, TriangleNum * 3);
#ifndef WIN32
- glUnlockArraysEXT();
+ glUnlockArraysEXT();
#endif
- if(!color)glDisableClientState(GL_NORMAL_ARRAY);
- if(color)glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- //drawdiffteximmediate(texture);
+ if (!color)glDisableClientState(GL_NORMAL_ARRAY);
+ if (color)glDisableClientState(GL_COLOR_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ //drawdiffteximmediate(texture);
}
void Model::drawdiffteximmediate(GLuint texture)
{
- glBindTexture(GL_TEXTURE_2D,(unsigned long)texture);
-
- glBegin(GL_TRIANGLES);
- for(int i=0;i<TriangleNum;i++){
- /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){
- if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z)
- &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z)
- &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){
- */glTexCoord2f(Triangles[i].gx[0],Triangles[i].gy[0]);
- if(color)glColor3f(normals[Triangles[i].vertex[0]].x,normals[Triangles[i].vertex[0]].y,normals[Triangles[i].vertex[0]].z);
- if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[0]].x,normals[Triangles[i].vertex[0]].y,normals[Triangles[i].vertex[0]].z);
- if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
- glVertex3f(vertex[Triangles[i].vertex[0]].x,vertex[Triangles[i].vertex[0]].y,vertex[Triangles[i].vertex[0]].z);
-
- glTexCoord2f(Triangles[i].gx[1],Triangles[i].gy[1]);
- if(color)glColor3f(normals[Triangles[i].vertex[1]].x,normals[Triangles[i].vertex[1]].y,normals[Triangles[i].vertex[1]].z);
- if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[1]].x,normals[Triangles[i].vertex[1]].y,normals[Triangles[i].vertex[1]].z);
- if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
- glVertex3f(vertex[Triangles[i].vertex[1]].x,vertex[Triangles[i].vertex[1]].y,vertex[Triangles[i].vertex[1]].z);
-
- glTexCoord2f(Triangles[i].gx[2],Triangles[i].gy[2]);
- if(color)glColor3f(normals[Triangles[i].vertex[2]].x,normals[Triangles[i].vertex[2]].y,normals[Triangles[i].vertex[2]].z);
- if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[2]].x,normals[Triangles[i].vertex[2]].y,normals[Triangles[i].vertex[2]].z);
- if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
- glVertex3f(vertex[Triangles[i].vertex[2]].x,vertex[Triangles[i].vertex[2]].y,vertex[Triangles[i].vertex[2]].z);
- //}
- //}
- }
- glEnd();
+ glBindTexture(GL_TEXTURE_2D, (unsigned long)texture);
+
+ glBegin(GL_TRIANGLES);
+ for (int i = 0; i < TriangleNum; i++) {
+ /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){
+ if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z)
+ &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z)
+ &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){
+ */glTexCoord2f(Triangles[i].gx[0], Triangles[i].gy[0]);
+ if (color)glColor3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z);
+ if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z);
+ if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+ glVertex3f(vertex[Triangles[i].vertex[0]].x, vertex[Triangles[i].vertex[0]].y, vertex[Triangles[i].vertex[0]].z);
+
+ glTexCoord2f(Triangles[i].gx[1], Triangles[i].gy[1]);
+ if (color)glColor3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z);
+ if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z);
+ if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+ glVertex3f(vertex[Triangles[i].vertex[1]].x, vertex[Triangles[i].vertex[1]].y, vertex[Triangles[i].vertex[1]].z);
+
+ glTexCoord2f(Triangles[i].gx[2], Triangles[i].gy[2]);
+ if (color)glColor3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z);
+ if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z);
+ if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+ glVertex3f(vertex[Triangles[i].vertex[2]].x, vertex[Triangles[i].vertex[2]].y, vertex[Triangles[i].vertex[2]].z);
+ //}
+ //}
+ }
+ glEnd();
}
-void Model::drawdecals(Texture shadowtexture,Texture bloodtexture,Texture bloodtexture2,Texture breaktexture)
+void Model::drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloodtexture2, Texture breaktexture)
{
- if(decals){
- if(type!=decalstype)return;
- static int i,j;
- static float distancemult;
- static int lasttype;
- static float viewdistsquared;
- static bool blend;
-
- viewdistsquared=viewdistance*viewdistance;
- blend=1;
-
- lasttype=-1;
- glEnable(GL_BLEND);
- glDisable(GL_LIGHTING);
- glDisable(GL_CULL_FACE);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glDepthMask(0);
- if(numdecals>max_model_decals)numdecals=max_model_decals;
- for(i=0;i<numdecals;i++){
- if(decaltype[i]==blooddecalfast&&decalalivetime[i]<2)decalalivetime[i]=2;
-
- if(decaltype[i]==shadowdecal&&decaltype[i]!=lasttype){
- shadowtexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- }
- if(decaltype[i]==breakdecal&&decaltype[i]!=lasttype){
- breaktexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- }
- if((decaltype[i]==blooddecal||decaltype[i]==blooddecalslow)&&decaltype[i]!=lasttype){
- bloodtexture.bind();
- if(blend){
- blend=0;
- glAlphaFunc(GL_GREATER, 0.15);
- glBlendFunc(GL_ONE,GL_ZERO);
- }
- }
- if((decaltype[i]==blooddecalfast)&&decaltype[i]!=lasttype){
- bloodtexture2.bind();
- if(blend){
- blend=0;
- glAlphaFunc(GL_GREATER, 0.15);
- glBlendFunc(GL_ONE,GL_ZERO);
- }
- }
- if(decaltype[i]==shadowdecal){
- glColor4f(1,1,1,decalopacity[i]);
- }
- if(decaltype[i]==breakdecal){
- glColor4f(1,1,1,decalopacity[i]);
- if(decalalivetime[i]>58)glColor4f(1,1,1,decalopacity[i]*(60-decalalivetime[i])/2);
- }
- if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)){
- glColor4f(1,1,1,decalopacity[i]);
- if(decalalivetime[i]<4)glColor4f(1,1,1,decalopacity[i]*decalalivetime[i]*.25);
- if(decalalivetime[i]>58)glColor4f(1,1,1,decalopacity[i]*(60-decalalivetime[i])/2);
- }
- lasttype=decaltype[i];
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- glBegin(GL_TRIANGLES);
- for(int j=0;j<3;j++)
- {
- glTexCoord2f(decaltexcoords[i][j][0], decaltexcoords[i][j][1]); glVertex3f(decalvertex[i][j].x,decalvertex[i][j].y,decalvertex[i][j].z);
- }
- glEnd();
- glPopMatrix();
- }
- for(i=numdecals-1;i>=0;i--){
- decalalivetime[i]+=multiplier;
- if(decaltype[i]==blooddecalslow)decalalivetime[i]-=multiplier*2/3;
- if(decaltype[i]==blooddecalfast)decalalivetime[i]+=multiplier*4;
- if(decaltype[i]==shadowdecal)DeleteDecal(i);
- if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)&&decalalivetime[i]>=60)DeleteDecal(i);
- }
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
+ if (decals) {
+ if (type != decalstype)return;
+ static int i, j;
+ static float distancemult;
+ static int lasttype;
+ static float viewdistsquared;
+ static bool blend;
+
+ viewdistsquared = viewdistance * viewdistance;
+ blend = 1;
+
+ lasttype = -1;
+ glEnable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_CULL_FACE);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDepthMask(0);
+ if (numdecals > max_model_decals)numdecals = max_model_decals;
+ for (i = 0; i < numdecals; i++) {
+ if (decaltype[i] == blooddecalfast && decalalivetime[i] < 2)decalalivetime[i] = 2;
+
+ if (decaltype[i] == shadowdecal && decaltype[i] != lasttype) {
+ shadowtexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ }
+ if (decaltype[i] == breakdecal && decaltype[i] != lasttype) {
+ breaktexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ }
+ if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalslow) && decaltype[i] != lasttype) {
+ bloodtexture.bind();
+ if (blend) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.15);
+ glBlendFunc(GL_ONE, GL_ZERO);
+ }
+ }
+ if ((decaltype[i] == blooddecalfast) && decaltype[i] != lasttype) {
+ bloodtexture2.bind();
+ if (blend) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.15);
+ glBlendFunc(GL_ONE, GL_ZERO);
+ }
+ }
+ if (decaltype[i] == shadowdecal) {
+ glColor4f(1, 1, 1, decalopacity[i]);
+ }
+ if (decaltype[i] == breakdecal) {
+ glColor4f(1, 1, 1, decalopacity[i]);
+ if (decalalivetime[i] > 58)glColor4f(1, 1, 1, decalopacity[i] * (60 - decalalivetime[i]) / 2);
+ }
+ if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow)) {
+ glColor4f(1, 1, 1, decalopacity[i]);
+ if (decalalivetime[i] < 4)glColor4f(1, 1, 1, decalopacity[i]*decalalivetime[i]*.25);
+ if (decalalivetime[i] > 58)glColor4f(1, 1, 1, decalopacity[i] * (60 - decalalivetime[i]) / 2);
+ }
+ lasttype = decaltype[i];
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ glBegin(GL_TRIANGLES);
+ for (int j = 0; j < 3; j++) {
+ glTexCoord2f(decaltexcoords[i][j][0], decaltexcoords[i][j][1]);
+ glVertex3f(decalvertex[i][j].x, decalvertex[i][j].y, decalvertex[i][j].z);
+ }
+ glEnd();
+ glPopMatrix();
+ }
+ for (i = numdecals - 1; i >= 0; i--) {
+ decalalivetime[i] += multiplier;
+ if (decaltype[i] == blooddecalslow)decalalivetime[i] -= multiplier * 2 / 3;
+ if (decaltype[i] == blooddecalfast)decalalivetime[i] += multiplier * 4;
+ if (decaltype[i] == shadowdecal)DeleteDecal(i);
+ if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow) && decalalivetime[i] >= 60)DeleteDecal(i);
+ }
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
}
void Model::DeleteDecal(int which)
{
- if(decals){
- if(type!=decalstype)return;
- decaltype[which]=decaltype[numdecals-1];
- decalposition[which]=decalposition[numdecals-1];
- for(int i=0;i<3;i++){
- decalvertex[which][i]=decalvertex[numdecals-1][i];
- decaltexcoords[which][i][0]=decaltexcoords[numdecals-1][i][0];
- decaltexcoords[which][i][1]=decaltexcoords[numdecals-1][i][1];
- }
- decalrotation[which]=decalrotation[numdecals-1];
- decalalivetime[which]=decalalivetime[numdecals-1];
- decalopacity[which]=decalopacity[numdecals-1];
- numdecals--;
- }
+ if (decals) {
+ if (type != decalstype)return;
+ decaltype[which] = decaltype[numdecals - 1];
+ decalposition[which] = decalposition[numdecals - 1];
+ for (int i = 0; i < 3; i++) {
+ decalvertex[which][i] = decalvertex[numdecals - 1][i];
+ decaltexcoords[which][i][0] = decaltexcoords[numdecals - 1][i][0];
+ decaltexcoords[which][i][1] = decaltexcoords[numdecals - 1][i][1];
+ }
+ decalrotation[which] = decalrotation[numdecals - 1];
+ decalalivetime[which] = decalalivetime[numdecals - 1];
+ decalopacity[which] = decalopacity[numdecals - 1];
+ numdecals--;
+ }
}
-void Model::MakeDecal(int atype, XYZ *where,float *size, float *opacity, float *rotation){
- if(decals){
- if(type!=decalstype)return;
-
- static float placex,placez;
- static XYZ rot;
- //static XYZ point,point1,point2;
- static float distance;
- static int i,j;
-
- if(*opacity>0)
- if(distsq(where,&boundingspherecenter)<(boundingsphereradius+*size)*(boundingsphereradius+*size))
- for(i=0;i<TriangleNum;i++){
- if(facenormals[i].y<-.1&&(vertex[Triangles[i].vertex[0]].y<where->y||vertex[Triangles[i].vertex[1]].y<where->y||vertex[Triangles[i].vertex[2]].y<where->y)){
- decalposition[numdecals]=*where;
- decaltype[numdecals]=atype;
- decalrotation[numdecals]=*rotation;
- decalalivetime[numdecals]=0;
- distance=abs(((facenormals[i].x*where->x)+(facenormals[i].y*where->y)+(facenormals[i].z*where->z)-((facenormals[i].x*vertex[Triangles[i].vertex[0]].x)+(facenormals[i].y*vertex[Triangles[i].vertex[0]].y)+(facenormals[i].z*vertex[Triangles[i].vertex[0]].z)))/facenormals[i].y);
- decalopacity[numdecals]=*opacity-distance/10;
-
- if(decalopacity[numdecals>0]){
- placex=vertex[Triangles[i].vertex[0]].x;
- placez=vertex[Triangles[i].vertex[0]].z;
-
- decaltexcoords[numdecals][0][0]=(placex-where->x)/(*size)/2+.5;
- decaltexcoords[numdecals][0][1]=(placez-where->z)/(*size)/2+.5;
-
- decalvertex[numdecals][0].x=placex;
- decalvertex[numdecals][0].z=placez;
- decalvertex[numdecals][0].y=vertex[Triangles[i].vertex[0]].y;
-
-
- placex=vertex[Triangles[i].vertex[1]].x;
- placez=vertex[Triangles[i].vertex[1]].z;
-
- decaltexcoords[numdecals][1][0]=(placex-where->x)/(*size)/2+.5;
- decaltexcoords[numdecals][1][1]=(placez-where->z)/(*size)/2+.5;
-
- decalvertex[numdecals][1].x=placex;
- decalvertex[numdecals][1].z=placez;
- decalvertex[numdecals][1].y=vertex[Triangles[i].vertex[1]].y;
-
-
- placex=vertex[Triangles[i].vertex[2]].x;
- placez=vertex[Triangles[i].vertex[2]].z;
-
- decaltexcoords[numdecals][2][0]=(placex-where->x)/(*size)/2+.5;
- decaltexcoords[numdecals][2][1]=(placez-where->z)/(*size)/2+.5;
-
- decalvertex[numdecals][2].x=placex;
- decalvertex[numdecals][2].z=placez;
- decalvertex[numdecals][2].y=vertex[Triangles[i].vertex[2]].y;
-
- if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
- if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
- if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
- if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
- {
- if(decalrotation[numdecals]){
- for(j=0;j<3;j++){
- rot.y=0;
- rot.x=decaltexcoords[numdecals][j][0]-.5;
- rot.z=decaltexcoords[numdecals][j][1]-.5;
- rot=DoRotation(rot,0,-decalrotation[numdecals],0);
- decaltexcoords[numdecals][j][0]=rot.x+.5;
- decaltexcoords[numdecals][j][1]=rot.z+.5;
- }
- }
- if(numdecals<max_model_decals-1)numdecals++;
- }
- }
- }
- }
- }
+void Model::MakeDecal(int atype, XYZ *where, float *size, float *opacity, float *rotation)
+{
+ if (decals) {
+ if (type != decalstype)return;
+
+ static float placex, placez;
+ static XYZ rot;
+ //static XYZ point,point1,point2;
+ static float distance;
+ static int i, j;
+
+ if (*opacity > 0)
+ if (distsq(where, &boundingspherecenter) < (boundingsphereradius + *size) * (boundingsphereradius + *size))
+ for (i = 0; i < TriangleNum; i++) {
+ if (facenormals[i].y < -.1 && (vertex[Triangles[i].vertex[0]].y < where->y || vertex[Triangles[i].vertex[1]].y < where->y || vertex[Triangles[i].vertex[2]].y < where->y)) {
+ decalposition[numdecals] = *where;
+ decaltype[numdecals] = atype;
+ decalrotation[numdecals] = *rotation;
+ decalalivetime[numdecals] = 0;
+ distance = abs(((facenormals[i].x * where->x) + (facenormals[i].y * where->y) + (facenormals[i].z * where->z) - ((facenormals[i].x * vertex[Triangles[i].vertex[0]].x) + (facenormals[i].y * vertex[Triangles[i].vertex[0]].y) + (facenormals[i].z * vertex[Triangles[i].vertex[0]].z))) / facenormals[i].y);
+ decalopacity[numdecals] = *opacity - distance / 10;
+
+ if (decalopacity[numdecals > 0]) {
+ placex = vertex[Triangles[i].vertex[0]].x;
+ placez = vertex[Triangles[i].vertex[0]].z;
+
+ decaltexcoords[numdecals][0][0] = (placex - where->x) / (*size) / 2 + .5;
+ decaltexcoords[numdecals][0][1] = (placez - where->z) / (*size) / 2 + .5;
+
+ decalvertex[numdecals][0].x = placex;
+ decalvertex[numdecals][0].z = placez;
+ decalvertex[numdecals][0].y = vertex[Triangles[i].vertex[0]].y;
+
+
+ placex = vertex[Triangles[i].vertex[1]].x;
+ placez = vertex[Triangles[i].vertex[1]].z;
+
+ decaltexcoords[numdecals][1][0] = (placex - where->x) / (*size) / 2 + .5;
+ decaltexcoords[numdecals][1][1] = (placez - where->z) / (*size) / 2 + .5;
+
+ decalvertex[numdecals][1].x = placex;
+ decalvertex[numdecals][1].z = placez;
+ decalvertex[numdecals][1].y = vertex[Triangles[i].vertex[1]].y;
+
+
+ placex = vertex[Triangles[i].vertex[2]].x;
+ placez = vertex[Triangles[i].vertex[2]].z;
+
+ decaltexcoords[numdecals][2][0] = (placex - where->x) / (*size) / 2 + .5;
+ decaltexcoords[numdecals][2][1] = (placez - where->z) / (*size) / 2 + .5;
+
+ decalvertex[numdecals][2].x = placex;
+ decalvertex[numdecals][2].z = placez;
+ decalvertex[numdecals][2].y = vertex[Triangles[i].vertex[2]].y;
+
+ if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+ if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+ if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+ if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1)) {
+ if (decalrotation[numdecals]) {
+ for (j = 0; j < 3; j++) {
+ rot.y = 0;
+ rot.x = decaltexcoords[numdecals][j][0] - .5;
+ rot.z = decaltexcoords[numdecals][j][1] - .5;
+ rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+ decaltexcoords[numdecals][j][0] = rot.x + .5;
+ decaltexcoords[numdecals][j][1] = rot.z + .5;
+ }
+ }
+ if (numdecals < max_model_decals - 1)numdecals++;
+ }
+ }
+ }
+ }
+ }
}
-void Model::MakeDecal(int atype, XYZ where,float size, float opacity, float rotation){
- if(decals){
- if(type!=decalstype)return;
-
- static float placex,placez;
- static XYZ rot;
- //static XYZ point,point1,point2;
- static float distance;
- static int i,j;
-
- if(opacity>0)
- if(distsq(&where,&boundingspherecenter)<(boundingsphereradius+size)*(boundingsphereradius+size))
- for(i=0;i<TriangleNum;i++){
- distance=abs(((facenormals[i].x*where.x)+(facenormals[i].y*where.y)+(facenormals[i].z*where.z)-((facenormals[i].x*vertex[Triangles[i].vertex[0]].x)+(facenormals[i].y*vertex[Triangles[i].vertex[0]].y)+(facenormals[i].z*vertex[Triangles[i].vertex[0]].z))));
- if(distance<.02&&abs(facenormals[i].y)>abs(facenormals[i].x)&&abs(facenormals[i].y)>abs(facenormals[i].z)){
- decalposition[numdecals]=where;
- decaltype[numdecals]=atype;
- decalrotation[numdecals]=rotation;
- decalalivetime[numdecals]=0;
- decalopacity[numdecals]=opacity-distance/10;
-
- if(decalopacity[numdecals>0]){
- placex=vertex[Triangles[i].vertex[0]].x;
- placez=vertex[Triangles[i].vertex[0]].z;
-
- decaltexcoords[numdecals][0][0]=(placex-where.x)/(size)/2+.5;
- decaltexcoords[numdecals][0][1]=(placez-where.z)/(size)/2+.5;
-
- decalvertex[numdecals][0].x=placex;
- decalvertex[numdecals][0].z=placez;
- decalvertex[numdecals][0].y=vertex[Triangles[i].vertex[0]].y;
-
-
- placex=vertex[Triangles[i].vertex[1]].x;
- placez=vertex[Triangles[i].vertex[1]].z;
-
- decaltexcoords[numdecals][1][0]=(placex-where.x)/(size)/2+.5;
- decaltexcoords[numdecals][1][1]=(placez-where.z)/(size)/2+.5;
-
- decalvertex[numdecals][1].x=placex;
- decalvertex[numdecals][1].z=placez;
- decalvertex[numdecals][1].y=vertex[Triangles[i].vertex[1]].y;
-
-
- placex=vertex[Triangles[i].vertex[2]].x;
- placez=vertex[Triangles[i].vertex[2]].z;
-
- decaltexcoords[numdecals][2][0]=(placex-where.x)/(size)/2+.5;
- decaltexcoords[numdecals][2][1]=(placez-where.z)/(size)/2+.5;
-
- decalvertex[numdecals][2].x=placex;
- decalvertex[numdecals][2].z=placez;
- decalvertex[numdecals][2].y=vertex[Triangles[i].vertex[2]].y;
-
- if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
- if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
- if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
- if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
- {
- if(decalrotation[numdecals]){
- for(j=0;j<3;j++){
- rot.y=0;
- rot.x=decaltexcoords[numdecals][j][0]-.5;
- rot.z=decaltexcoords[numdecals][j][1]-.5;
- rot=DoRotation(rot,0,-decalrotation[numdecals],0);
- decaltexcoords[numdecals][j][0]=rot.x+.5;
- decaltexcoords[numdecals][j][1]=rot.z+.5;
- }
- }
- if(numdecals<max_model_decals-1)numdecals++;
- }
- }
- }
- else if(distance<.02&&abs(facenormals[i].x)>abs(facenormals[i].y)&&abs(facenormals[i].x)>abs(facenormals[i].z)){
- decalposition[numdecals]=where;
- decaltype[numdecals]=atype;
- decalrotation[numdecals]=rotation;
- decalalivetime[numdecals]=0;
- decalopacity[numdecals]=opacity-distance/10;
-
- if(decalopacity[numdecals>0]){
- placex=vertex[Triangles[i].vertex[0]].y;
- placez=vertex[Triangles[i].vertex[0]].z;
-
- decaltexcoords[numdecals][0][0]=(placex-where.y)/(size)/2+.5;
- decaltexcoords[numdecals][0][1]=(placez-where.z)/(size)/2+.5;
-
- decalvertex[numdecals][0].x=vertex[Triangles[i].vertex[0]].x;
- decalvertex[numdecals][0].z=placez;
- decalvertex[numdecals][0].y=placex;
-
-
- placex=vertex[Triangles[i].vertex[1]].y;
- placez=vertex[Triangles[i].vertex[1]].z;
-
- decaltexcoords[numdecals][1][0]=(placex-where.y)/(size)/2+.5;
- decaltexcoords[numdecals][1][1]=(placez-where.z)/(size)/2+.5;
-
- decalvertex[numdecals][1].x=vertex[Triangles[i].vertex[1]].x;
- decalvertex[numdecals][1].z=placez;
- decalvertex[numdecals][1].y=placex;
-
-
- placex=vertex[Triangles[i].vertex[2]].y;
- placez=vertex[Triangles[i].vertex[2]].z;
-
- decaltexcoords[numdecals][2][0]=(placex-where.y)/(size)/2+.5;
- decaltexcoords[numdecals][2][1]=(placez-where.z)/(size)/2+.5;
-
- decalvertex[numdecals][2].x=vertex[Triangles[i].vertex[2]].x;
- decalvertex[numdecals][2].z=placez;
- decalvertex[numdecals][2].y=placex;
-
- if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
- if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
- if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
- if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
- {
- if(decalrotation[numdecals]){
- for(j=0;j<3;j++){
- rot.y=0;
- rot.x=decaltexcoords[numdecals][j][0]-.5;
- rot.z=decaltexcoords[numdecals][j][1]-.5;
- rot=DoRotation(rot,0,-decalrotation[numdecals],0);
- decaltexcoords[numdecals][j][0]=rot.x+.5;
- decaltexcoords[numdecals][j][1]=rot.z+.5;
- }
- }
- if(numdecals<max_model_decals-1)numdecals++;
- }
- }
- }
- else if(distance<.02&&abs(facenormals[i].z)>abs(facenormals[i].y)&&abs(facenormals[i].z)>abs(facenormals[i].x)){
- decalposition[numdecals]=where;
- decaltype[numdecals]=atype;
- decalrotation[numdecals]=rotation;
- decalalivetime[numdecals]=0;
- decalopacity[numdecals]=opacity-distance/10;
-
- if(decalopacity[numdecals>0]){
- placex=vertex[Triangles[i].vertex[0]].x;
- placez=vertex[Triangles[i].vertex[0]].y;
-
- decaltexcoords[numdecals][0][0]=(placex-where.x)/(size)/2+.5;
- decaltexcoords[numdecals][0][1]=(placez-where.y)/(size)/2+.5;
-
- decalvertex[numdecals][0].x=placex;
- decalvertex[numdecals][0].z=vertex[Triangles[i].vertex[0]].z;
- decalvertex[numdecals][0].y=placez;
-
-
- placex=vertex[Triangles[i].vertex[1]].x;
- placez=vertex[Triangles[i].vertex[1]].y;
-
- decaltexcoords[numdecals][1][0]=(placex-where.x)/(size)/2+.5;
- decaltexcoords[numdecals][1][1]=(placez-where.y)/(size)/2+.5;
-
- decalvertex[numdecals][1].x=placex;
- decalvertex[numdecals][1].z=vertex[Triangles[i].vertex[1]].z;
- decalvertex[numdecals][1].y=placez;
-
-
- placex=vertex[Triangles[i].vertex[2]].x;
- placez=vertex[Triangles[i].vertex[2]].y;
-
- decaltexcoords[numdecals][2][0]=(placex-where.x)/(size)/2+.5;
- decaltexcoords[numdecals][2][1]=(placez-where.y)/(size)/2+.5;
-
- decalvertex[numdecals][2].x=placex;
- decalvertex[numdecals][2].z=vertex[Triangles[i].vertex[2]].z;
- decalvertex[numdecals][2].y=placez;
-
- if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
- if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
- if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
- if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
- {
- if(decalrotation[numdecals]){
- for(j=0;j<3;j++){
- rot.y=0;
- rot.x=decaltexcoords[numdecals][j][0]-.5;
- rot.z=decaltexcoords[numdecals][j][1]-.5;
- rot=DoRotation(rot,0,-decalrotation[numdecals],0);
- decaltexcoords[numdecals][j][0]=rot.x+.5;
- decaltexcoords[numdecals][j][1]=rot.z+.5;
- }
- }
- if(numdecals<max_model_decals-1)numdecals++;
- }
- }
- }
- }
- }
+void Model::MakeDecal(int atype, XYZ where, float size, float opacity, float rotation)
+{
+ if (decals) {
+ if (type != decalstype)return;
+
+ static float placex, placez;
+ static XYZ rot;
+ //static XYZ point,point1,point2;
+ static float distance;
+ static int i, j;
+
+ if (opacity > 0)
+ if (distsq(&where, &boundingspherecenter) < (boundingsphereradius + size) * (boundingsphereradius + size))
+ for (i = 0; i < TriangleNum; i++) {
+ distance = abs(((facenormals[i].x * where.x) + (facenormals[i].y * where.y) + (facenormals[i].z * where.z) - ((facenormals[i].x * vertex[Triangles[i].vertex[0]].x) + (facenormals[i].y * vertex[Triangles[i].vertex[0]].y) + (facenormals[i].z * vertex[Triangles[i].vertex[0]].z))));
+ if (distance < .02 && abs(facenormals[i].y) > abs(facenormals[i].x) && abs(facenormals[i].y) > abs(facenormals[i].z)) {
+ decalposition[numdecals] = where;
+ decaltype[numdecals] = atype;
+ decalrotation[numdecals] = rotation;
+ decalalivetime[numdecals] = 0;
+ decalopacity[numdecals] = opacity - distance / 10;
+
+ if (decalopacity[numdecals > 0]) {
+ placex = vertex[Triangles[i].vertex[0]].x;
+ placez = vertex[Triangles[i].vertex[0]].z;
+
+ decaltexcoords[numdecals][0][0] = (placex - where.x) / (size) / 2 + .5;
+ decaltexcoords[numdecals][0][1] = (placez - where.z) / (size) / 2 + .5;
+
+ decalvertex[numdecals][0].x = placex;
+ decalvertex[numdecals][0].z = placez;
+ decalvertex[numdecals][0].y = vertex[Triangles[i].vertex[0]].y;
+
+
+ placex = vertex[Triangles[i].vertex[1]].x;
+ placez = vertex[Triangles[i].vertex[1]].z;
+
+ decaltexcoords[numdecals][1][0] = (placex - where.x) / (size) / 2 + .5;
+ decaltexcoords[numdecals][1][1] = (placez - where.z) / (size) / 2 + .5;
+
+ decalvertex[numdecals][1].x = placex;
+ decalvertex[numdecals][1].z = placez;
+ decalvertex[numdecals][1].y = vertex[Triangles[i].vertex[1]].y;
+
+
+ placex = vertex[Triangles[i].vertex[2]].x;
+ placez = vertex[Triangles[i].vertex[2]].z;
+
+ decaltexcoords[numdecals][2][0] = (placex - where.x) / (size) / 2 + .5;
+ decaltexcoords[numdecals][2][1] = (placez - where.z) / (size) / 2 + .5;
+
+ decalvertex[numdecals][2].x = placex;
+ decalvertex[numdecals][2].z = placez;
+ decalvertex[numdecals][2].y = vertex[Triangles[i].vertex[2]].y;
+
+ if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+ if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+ if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+ if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1)) {
+ if (decalrotation[numdecals]) {
+ for (j = 0; j < 3; j++) {
+ rot.y = 0;
+ rot.x = decaltexcoords[numdecals][j][0] - .5;
+ rot.z = decaltexcoords[numdecals][j][1] - .5;
+ rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+ decaltexcoords[numdecals][j][0] = rot.x + .5;
+ decaltexcoords[numdecals][j][1] = rot.z + .5;
+ }
+ }
+ if (numdecals < max_model_decals - 1)numdecals++;
+ }
+ }
+ } else if (distance < .02 && abs(facenormals[i].x) > abs(facenormals[i].y) && abs(facenormals[i].x) > abs(facenormals[i].z)) {
+ decalposition[numdecals] = where;
+ decaltype[numdecals] = atype;
+ decalrotation[numdecals] = rotation;
+ decalalivetime[numdecals] = 0;
+ decalopacity[numdecals] = opacity - distance / 10;
+
+ if (decalopacity[numdecals > 0]) {
+ placex = vertex[Triangles[i].vertex[0]].y;
+ placez = vertex[Triangles[i].vertex[0]].z;
+
+ decaltexcoords[numdecals][0][0] = (placex - where.y) / (size) / 2 + .5;
+ decaltexcoords[numdecals][0][1] = (placez - where.z) / (size) / 2 + .5;
+
+ decalvertex[numdecals][0].x = vertex[Triangles[i].vertex[0]].x;
+ decalvertex[numdecals][0].z = placez;
+ decalvertex[numdecals][0].y = placex;
+
+
+ placex = vertex[Triangles[i].vertex[1]].y;
+ placez = vertex[Triangles[i].vertex[1]].z;
+
+ decaltexcoords[numdecals][1][0] = (placex - where.y) / (size) / 2 + .5;
+ decaltexcoords[numdecals][1][1] = (placez - where.z) / (size) / 2 + .5;
+
+ decalvertex[numdecals][1].x = vertex[Triangles[i].vertex[1]].x;
+ decalvertex[numdecals][1].z = placez;
+ decalvertex[numdecals][1].y = placex;
+
+
+ placex = vertex[Triangles[i].vertex[2]].y;
+ placez = vertex[Triangles[i].vertex[2]].z;
+
+ decaltexcoords[numdecals][2][0] = (placex - where.y) / (size) / 2 + .5;
+ decaltexcoords[numdecals][2][1] = (placez - where.z) / (size) / 2 + .5;
+
+ decalvertex[numdecals][2].x = vertex[Triangles[i].vertex[2]].x;
+ decalvertex[numdecals][2].z = placez;
+ decalvertex[numdecals][2].y = placex;
+
+ if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+ if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+ if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+ if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1)) {
+ if (decalrotation[numdecals]) {
+ for (j = 0; j < 3; j++) {
+ rot.y = 0;
+ rot.x = decaltexcoords[numdecals][j][0] - .5;
+ rot.z = decaltexcoords[numdecals][j][1] - .5;
+ rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+ decaltexcoords[numdecals][j][0] = rot.x + .5;
+ decaltexcoords[numdecals][j][1] = rot.z + .5;
+ }
+ }
+ if (numdecals < max_model_decals - 1)numdecals++;
+ }
+ }
+ } else if (distance < .02 && abs(facenormals[i].z) > abs(facenormals[i].y) && abs(facenormals[i].z) > abs(facenormals[i].x)) {
+ decalposition[numdecals] = where;
+ decaltype[numdecals] = atype;
+ decalrotation[numdecals] = rotation;
+ decalalivetime[numdecals] = 0;
+ decalopacity[numdecals] = opacity - distance / 10;
+
+ if (decalopacity[numdecals > 0]) {
+ placex = vertex[Triangles[i].vertex[0]].x;
+ placez = vertex[Triangles[i].vertex[0]].y;
+
+ decaltexcoords[numdecals][0][0] = (placex - where.x) / (size) / 2 + .5;
+ decaltexcoords[numdecals][0][1] = (placez - where.y) / (size) / 2 + .5;
+
+ decalvertex[numdecals][0].x = placex;
+ decalvertex[numdecals][0].z = vertex[Triangles[i].vertex[0]].z;
+ decalvertex[numdecals][0].y = placez;
+
+
+ placex = vertex[Triangles[i].vertex[1]].x;
+ placez = vertex[Triangles[i].vertex[1]].y;
+
+ decaltexcoords[numdecals][1][0] = (placex - where.x) / (size) / 2 + .5;
+ decaltexcoords[numdecals][1][1] = (placez - where.y) / (size) / 2 + .5;
+
+ decalvertex[numdecals][1].x = placex;
+ decalvertex[numdecals][1].z = vertex[Triangles[i].vertex[1]].z;
+ decalvertex[numdecals][1].y = placez;
+
+
+ placex = vertex[Triangles[i].vertex[2]].x;
+ placez = vertex[Triangles[i].vertex[2]].y;
+
+ decaltexcoords[numdecals][2][0] = (placex - where.x) / (size) / 2 + .5;
+ decaltexcoords[numdecals][2][1] = (placez - where.y) / (size) / 2 + .5;
+
+ decalvertex[numdecals][2].x = placex;
+ decalvertex[numdecals][2].z = vertex[Triangles[i].vertex[2]].z;
+ decalvertex[numdecals][2].y = placez;
+
+ if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+ if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+ if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+ if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1)) {
+ if (decalrotation[numdecals]) {
+ for (j = 0; j < 3; j++) {
+ rot.y = 0;
+ rot.x = decaltexcoords[numdecals][j][0] - .5;
+ rot.z = decaltexcoords[numdecals][j][1] - .5;
+ rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+ decaltexcoords[numdecals][j][0] = rot.x + .5;
+ decaltexcoords[numdecals][j][1] = rot.z + .5;
+ }
+ }
+ if (numdecals < max_model_decals - 1)numdecals++;
+ }
+ }
+ }
+ }
+ }
}
Model::~Model()
{
- deallocate();
+ deallocate();
textureptr.destroy();
}
void Model::deallocate()
{
- int i = 0, j = 0;
+ int i = 0, j = 0;
- if(owner)free(owner);
- owner = 0;
+ if (owner)free(owner);
+ owner = 0;
- if(possible)free(possible);
- possible = 0;
+ if (possible)free(possible);
+ possible = 0;
- if(vertex)free(vertex);
- vertex = 0;
+ if (vertex)free(vertex);
+ vertex = 0;
- if(normals)free(normals);
- normals = 0;
+ if (normals)free(normals);
+ normals = 0;
- if(facenormals)free(facenormals);
- facenormals = 0;
+ if (facenormals)free(facenormals);
+ facenormals = 0;
- if(Triangles)free(Triangles);
- Triangles = 0;
+ if (Triangles)free(Triangles);
+ Triangles = 0;
- if(vArray)free(vArray);
- vArray = 0;
+ if (vArray)free(vArray);
+ vArray = 0;
- //allow decals
- if(decaltexcoords)
- {
- for(i=0;i<max_model_decals;i++)
- {
- for(j=0;j<3;j++)
- {
- free(decaltexcoords[i][j]);
- }
- free(decaltexcoords[i]);
- }
- free(decaltexcoords);
- }
- decaltexcoords = 0;
+ //allow decals
+ if (decaltexcoords) {
+ for (i = 0; i < max_model_decals; i++) {
+ for (j = 0; j < 3; j++) {
+ free(decaltexcoords[i][j]);
+ }
+ free(decaltexcoords[i]);
+ }
+ free(decaltexcoords);
+ }
+ decaltexcoords = 0;
- if (decalvertex)
- {
- for(i=0;i<max_model_decals;i++)
- {
- free(decalvertex[i]);
- }
- free(decalvertex);
- }
- decalvertex = 0;
+ if (decalvertex) {
+ for (i = 0; i < max_model_decals; i++) {
+ free(decalvertex[i]);
+ }
+ free(decalvertex);
+ }
+ decalvertex = 0;
- free(decaltype);
- decaltype = 0;
+ free(decaltype);
+ decaltype = 0;
- free(decalopacity);
- decalopacity = 0;
+ free(decalopacity);
+ decalopacity = 0;
- free(decalrotation);
- decalrotation = 0;
+ free(decalrotation);
+ decalrotation = 0;
- free(decalalivetime);
- decalalivetime = 0;
+ free(decalalivetime);
+ decalalivetime = 0;
- free(decalposition);
- decalposition = 0;
+ free(decalposition);
+ decalposition = 0;
};
Model::Model()
{
- vertexNum = 0,TriangleNum = 0;
- hastexture = 0;
+ vertexNum = 0, TriangleNum = 0;
+ hastexture = 0;
- type = 0,oldtype = 0;
+ type = 0, oldtype = 0;
- possible=0;
- owner=0;
- vertex=0;
- normals=0;
- facenormals=0;
- Triangles=0;
- vArray=0;
+ possible = 0;
+ owner = 0;
+ vertex = 0;
+ normals = 0;
+ facenormals = 0;
+ Triangles = 0;
+ vArray = 0;
- memset(&modelTexture, 0, sizeof(modelTexture));
- numpossible = 0;
- color = 0;
+ memset(&modelTexture, 0, sizeof(modelTexture));
+ numpossible = 0;
+ color = 0;
- boundingspherecenter = 0;
- boundingsphereradius = 0;
+ boundingspherecenter = 0;
+ boundingsphereradius = 0;
- decaltexcoords=0;
- decalvertex=0;
- decaltype=0;
- decalopacity=0;
- decalrotation=0;
- decalalivetime=0;
- decalposition=0;
+ decaltexcoords = 0;
+ decalvertex = 0;
+ decaltype = 0;
+ decalopacity = 0;
+ decalrotation = 0;
+ decalalivetime = 0;
+ decalposition = 0;
- numdecals = 0;
+ numdecals = 0;
- flat = 0;
+ flat = 0;
- type=nothing;
+ type = nothing;
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
// Textures List
//
typedef struct {
- long xsz,ysz;
- GLubyte *txt;
+ long xsz, ysz;
+ GLubyte *txt;
} ModelTexture;
//
// Model Structures
//
-class TexturedTriangle{
+class TexturedTriangle
+{
public:
- short vertex[3];
- float gx[3],gy[3];
+ short vertex[3];
+ float gx[3], gy[3];
};
#define max_model_decals 300
#define rawtype 2
#define decalstype 3
-class Model{
+class Model
+{
public:
- short vertexNum,TriangleNum;
- bool hastexture;
-
- int type,oldtype;
-
- int* possible;
- int* owner;
- XYZ* vertex;
- XYZ* normals;
- XYZ* facenormals;
- TexturedTriangle* Triangles;
- GLfloat* vArray;
-
- /*int possible[max_model_vertex];
- int owner[max_textured_triangle];
- XYZ vertex[max_model_vertex];
- XYZ normals[max_model_vertex];
- XYZ facenormals[max_textured_triangle];
- TexturedTriangle Triangles[max_textured_triangle];
- GLfloat vArray[max_textured_triangle*24];*/
-
- Texture textureptr;
- ModelTexture modelTexture;
- int numpossible;
- bool color;
-
- XYZ boundingspherecenter;
- float boundingsphereradius;
-
- float*** decaltexcoords;
- XYZ** decalvertex;
- int* decaltype;
- float* decalopacity;
- float* decalrotation;
- float* decalalivetime;
- XYZ* decalposition;
-
- /*float decaltexcoords[max_model_decals][3][2];
- XYZ decalvertex[max_model_decals][3];
- int decaltype[max_model_decals];
- float decalopacity[max_model_decals];
- float decalrotation[max_model_decals];
- float decalalivetime[max_model_decals];
- XYZ decalposition[max_model_decals];*/
-
- int numdecals;
-
- bool flat;
-
- void DeleteDecal(int which);
- void MakeDecal(int atype, XYZ *where, float *size, float *opacity, float *rotation);
- void MakeDecal(int atype, XYZ where, float size, float opacity, float rotation);
- void drawdecals(Texture shadowtexture,Texture bloodtexture,Texture bloodtexture2,Texture breaktexture);
- int SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate);
- int SphereCheckPossible(XYZ *p1,float radius, XYZ *move, float *rotate);
- int LineCheck(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate);
- int LineCheckSlide(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate);
- int LineCheckPossible(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate);
- int LineCheckSlidePossible(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate);
- void UpdateVertexArray();
- void UpdateVertexArrayNoTex();
- void UpdateVertexArrayNoTexNoNorm();
- bool loadnotex(const char *filename);
- bool loadraw(char *filename);
- bool load(const char *filename,bool texture);
- bool loaddecal(const char *filename,bool texture);
- void Scale(float xscale,float yscale,float zscale);
- void FlipTexCoords();
- void UniformTexCoords();
- void ScaleTexCoords(float howmuch);
- void ScaleNormals(float xscale,float yscale,float zscale);
- void Translate(float xtrans,float ytrans,float ztrans);
- void CalculateNormals(bool facenormalise);
- void draw();
- void drawdifftex(GLuint texture);
- void drawdifftex(Texture texture);
- void drawimmediate();
- void drawdiffteximmediate(GLuint texture);
- void Rotate(float xang,float yang,float zang);
- ~Model();
- void deallocate();
- Model();
+ short vertexNum, TriangleNum;
+ bool hastexture;
+
+ int type, oldtype;
+
+ int* possible;
+ int* owner;
+ XYZ* vertex;
+ XYZ* normals;
+ XYZ* facenormals;
+ TexturedTriangle* Triangles;
+ GLfloat* vArray;
+
+ /*int possible[max_model_vertex];
+ int owner[max_textured_triangle];
+ XYZ vertex[max_model_vertex];
+ XYZ normals[max_model_vertex];
+ XYZ facenormals[max_textured_triangle];
+ TexturedTriangle Triangles[max_textured_triangle];
+ GLfloat vArray[max_textured_triangle*24];*/
+
+ Texture textureptr;
+ ModelTexture modelTexture;
+ int numpossible;
+ bool color;
+
+ XYZ boundingspherecenter;
+ float boundingsphereradius;
+
+ float*** decaltexcoords;
+ XYZ** decalvertex;
+ int* decaltype;
+ float* decalopacity;
+ float* decalrotation;
+ float* decalalivetime;
+ XYZ* decalposition;
+
+ /*float decaltexcoords[max_model_decals][3][2];
+ XYZ decalvertex[max_model_decals][3];
+ int decaltype[max_model_decals];
+ float decalopacity[max_model_decals];
+ float decalrotation[max_model_decals];
+ float decalalivetime[max_model_decals];
+ XYZ decalposition[max_model_decals];*/
+
+ int numdecals;
+
+ bool flat;
+
+ void DeleteDecal(int which);
+ void MakeDecal(int atype, XYZ *where, float *size, float *opacity, float *rotation);
+ void MakeDecal(int atype, XYZ where, float size, float opacity, float rotation);
+ void drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloodtexture2, Texture breaktexture);
+ int SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate);
+ int SphereCheckPossible(XYZ *p1, float radius, XYZ *move, float *rotate);
+ int LineCheck(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate);
+ int LineCheckSlide(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate);
+ int LineCheckPossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate);
+ int LineCheckSlidePossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate);
+ void UpdateVertexArray();
+ void UpdateVertexArrayNoTex();
+ void UpdateVertexArrayNoTexNoNorm();
+ bool loadnotex(const char *filename);
+ bool loadraw(char *filename);
+ bool load(const char *filename, bool texture);
+ bool loaddecal(const char *filename, bool texture);
+ void Scale(float xscale, float yscale, float zscale);
+ void FlipTexCoords();
+ void UniformTexCoords();
+ void ScaleTexCoords(float howmuch);
+ void ScaleNormals(float xscale, float yscale, float zscale);
+ void Translate(float xtrans, float ytrans, float ztrans);
+ void CalculateNormals(bool facenormalise);
+ void draw();
+ void drawdifftex(GLuint texture);
+ void drawdifftex(Texture texture);
+ void drawimmediate();
+ void drawdiffteximmediate(GLuint texture);
+ void Rotate(float xang, float yang, float zang);
+ ~Model();
+ void deallocate();
+ Model();
};
#endif
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
//Functions
-bool Objects::checkcollide(XYZ startpoint,XYZ endpoint,int which){
- static XYZ colpoint,colviewer,coltarget;
- static int i;
-
- startpoint.y+=.1;
- endpoint.y+=.1;
- startpoint.y-=.1;
- endpoint.y-=.1;
-
- for(i=0;i<numobjects;i++){
- if(type[i]!=treeleavestype&&type[i]!=treetrunktype&&type[i]!=bushtype&&type[i]!=firetype&&i!=which){
- colviewer=startpoint;
- coltarget=endpoint;
- if(model[i].LineCheck(&colviewer,&coltarget,&colpoint,&position[i],&yaw[i])!=-1)return 1;
- }
- }
-
- return 0;
+bool Objects::checkcollide(XYZ startpoint, XYZ endpoint, int which)
+{
+ static XYZ colpoint, colviewer, coltarget;
+ static int i;
+
+ startpoint.y += .1;
+ endpoint.y += .1;
+ startpoint.y -= .1;
+ endpoint.y -= .1;
+
+ for (i = 0; i < numobjects; i++) {
+ if (type[i] != treeleavestype && type[i] != treetrunktype && type[i] != bushtype && type[i] != firetype && i != which) {
+ colviewer = startpoint;
+ coltarget = endpoint;
+ if (model[i].LineCheck(&colviewer, &coltarget, &colpoint, &position[i], &yaw[i]) != -1)return 1;
+ }
+ }
+
+ return 0;
}
-void Objects::SphereCheckPossible(XYZ *p1,float radius)
+void Objects::SphereCheckPossible(XYZ *p1, float radius)
{
- static int i,j;
- static int whichpatchx;
- static int whichpatchz;
-
- whichpatchx=p1->x/(terrain.size/subdivision*terrain.scale);
- whichpatchz=p1->z/(terrain.size/subdivision*terrain.scale);
-
- if(whichpatchx>=0&&whichpatchz>=0&&whichpatchx<subdivision&&whichpatchz<subdivision)
- if(terrain.patchobjectnum[whichpatchx][whichpatchz]>0&&terrain.patchobjectnum[whichpatchx][whichpatchz]<500)
- for(j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++){
- i=terrain.patchobjects[whichpatchx][whichpatchz][j];
- possible[i]=0;
- if(model[i].SphereCheckPossible(p1, radius, &position[i], &yaw[i])!=-1){
- possible[i]=1;
- }
- }
+ static int i, j;
+ static int whichpatchx;
+ static int whichpatchz;
+
+ whichpatchx = p1->x / (terrain.size / subdivision * terrain.scale);
+ whichpatchz = p1->z / (terrain.size / subdivision * terrain.scale);
+
+ if (whichpatchx >= 0 && whichpatchz >= 0 && whichpatchx < subdivision && whichpatchz < subdivision)
+ if (terrain.patchobjectnum[whichpatchx][whichpatchz] > 0 && terrain.patchobjectnum[whichpatchx][whichpatchz] < 500)
+ for (j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) {
+ i = terrain.patchobjects[whichpatchx][whichpatchz][j];
+ possible[i] = 0;
+ if (model[i].SphereCheckPossible(p1, radius, &position[i], &yaw[i]) != -1) {
+ possible[i] = 1;
+ }
+ }
}
void Objects::Draw()
{
- static float distance;
- static int i,j;
- static XYZ moved,terrainlight;
- bool hidden;
-
- for(i=0;i<numobjects;i++){
- if(type[i]!=firetype){
- moved=DoRotation(model[i].boundingspherecenter,0,yaw[i],0);
- if(type[i]==tunneltype||frustum.SphereInFrustum(position[i].x+moved.x,position[i].y+moved.y,position[i].z+moved.z,model[i].boundingsphereradius)){
- distance=distsq(&viewer,&position[i]);
- distance*=1.2;
- hidden=!(distsqflat(&viewer,&position[i])>playerdist+3||(type[i]!=bushtype&&type[i]!=treeleavestype));
- if(!hidden){
-
- if(detail==2&&distance>viewdistance*viewdistance/4&&environment==desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness );
- else glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
- distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
- if(distance>1)distance=1;
- if(distance>0){
-
- /*if(checkcollide(viewer,DoRotation(model[i].vertex[model[i].vertexNum],0,yaw[i],0)*scale[i]+position[i],i)){
- occluded[i]+=1;
- }
- else occluded[i]=0;*/
- if(occluded[i]<6){
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- if(!model[i].color)glEnable(GL_LIGHTING);
- else glDisable(GL_LIGHTING);
- glDepthMask(1);
- glTranslatef(position[i].x,position[i].y,position[i].z);
- if(type[i]==bushtype){
- messedwith[i]-=multiplier;
- if(rotxvel[i]||rotx[i]){
- if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
- if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
- if(rotx[i]>0)rotxvel[i]-=multiplier*4;
- if(rotx[i]<0)rotxvel[i]+=multiplier*4;
- if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
- if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
- if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
- if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
- rotx[i]+=rotxvel[i]*multiplier*4;
- }
- if(rotyvel[i]||roty[i]){
- if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
- if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
- if(roty[i]>0)rotyvel[i]-=multiplier*4;
- if(roty[i]<0)rotyvel[i]+=multiplier*4;
- if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
- if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
- if(fabs(roty[i])<multiplier*4)roty[i]=0;
- if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
- roty[i]+=rotyvel[i]*multiplier*4;
- }
- if(roty[i]){
- glRotatef(roty[i],1,0,0);
- }
- if(rotx[i]){
- glRotatef(-rotx[i],0,0,1);
- }
- if(rotx[i]>10)rotx[i]=10;
- if(rotx[i]<-10)rotx[i]=-10;
- if(roty[i]>10)roty[i]=10;
- if(roty[i]<-10)roty[i]=-10;
- }
- if(type[i]==treetrunktype||type[i]==treeleavestype){
- if(type[i]==treetrunktype||environment==2){
- messedwith[i]-=multiplier;
- if(rotxvel[i]||rotx[i]){
- if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
- if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
- if(rotx[i]>0)rotxvel[i]-=multiplier*4;
- if(rotx[i]<0)rotxvel[i]+=multiplier*4;
- if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
- if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
- if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
- if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
- rotx[i]+=rotxvel[i]*multiplier*4;
- }
- if(rotyvel[i]||roty[i]){
- if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
- if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
- if(roty[i]>0)rotyvel[i]-=multiplier*4;
- if(roty[i]<0)rotyvel[i]+=multiplier*4;
- if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
- if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
- if(fabs(roty[i])<multiplier*4)roty[i]=0;
- if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
- roty[i]+=rotyvel[i]*multiplier*4;
- }
- if(roty[i]){
- glRotatef(roty[i]/6,1,0,0);
- }
- if(rotx[i]){
- glRotatef(-rotx[i]/6,0,0,1);
- }
- if(rotx[i]>10)rotx[i]=10;
- if(rotx[i]<-10)rotx[i]=-10;
- if(roty[i]>10)roty[i]=10;
- if(roty[i]<-10)roty[i]=-10;
- }
- else
- {
- messedwith[i]-=multiplier;
- if(rotxvel[i]||rotx[i]){
- if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
- if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
- if(rotx[i]>0)rotxvel[i]-=multiplier*4;
- if(rotx[i]<0)rotxvel[i]+=multiplier*4;
- if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
- if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
- if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
- if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
- rotx[i]+=rotxvel[i]*multiplier*4;
- }
- if(rotyvel[i]||roty[i]){
- if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
- if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
- if(roty[i]>0)rotyvel[i]-=multiplier*4;
- if(roty[i]<0)rotyvel[i]+=multiplier*4;
- if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
- if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
- if(fabs(roty[i])<multiplier*4)roty[i]=0;
- if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
- roty[i]+=rotyvel[i]*multiplier*4;
- }
- if(roty[i]){
- glRotatef(roty[i]/4,1,0,0);
- }
- if(rotx[i]){
- glRotatef(-rotx[i]/4,0,0,1);
- }
- if(rotx[i]>10)rotx[i]=10;
- if(rotx[i]<-10)rotx[i]=-10;
- if(roty[i]>10)roty[i]=10;
- if(roty[i]<-10)roty[i]=-10;
- }
-
- }
- if(/*detail==2&&*/environment==snowyenvironment){
- if(type[i]==treeleavestype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*1.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- if(type[i]==treetrunktype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- if(type[i]==bushtype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*4*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- }
- if(/*detail==2&&*/environment==grassyenvironment){
- if(type[i]==treeleavestype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*1.5*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- if(type[i]==treetrunktype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*.5*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- if(type[i]==bushtype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*4*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- }
- if(/*detail==2&&*/environment==desertenvironment){
- if(type[i]==bushtype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*4*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- }
- glRotatef(yaw[i],0,1,0);
- if(distance>1)distance=1;
- glColor4f((1-shadowed[i])/2+.5,(1-shadowed[i])/2+.5,(1-shadowed[i])/2+.5,distance);
- if(distance>=1){
- glDisable(GL_BLEND);
- glAlphaFunc(GL_GREATER, 0.5);
- }
- if(distance<1){
- glEnable(GL_BLEND);
- glAlphaFunc(GL_GREATER, 0.1);
- }
- if(type[i]!=treetrunktype&&type[i]!=treeleavestype&&type[i]!=bushtype&&type[i]!=rocktype){
- glEnable(GL_CULL_FACE);
- glAlphaFunc(GL_GREATER, 0.0001);
- model[i].drawdifftex(boxtextureptr);
- model[i].drawdecals(terrain.shadowtexture,terrain.bloodtexture,terrain.bloodtexture2,terrain.breaktexture);
- }
- if(type[i]==rocktype){
- glEnable(GL_CULL_FACE);
- glAlphaFunc(GL_GREATER, 0.0001);
- glColor4f((1-shadowed[i])/2+light.ambient[0],(1-shadowed[i])/2+light.ambient[1],(1-shadowed[i])/2+light.ambient[2],distance);
- model[i].drawdifftex(rocktextureptr);
- model[i].drawdecals(terrain.shadowtexture,terrain.bloodtexture,terrain.bloodtexture2,terrain.breaktexture);
- }
- if(type[i]==treeleavestype){
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- terrainlight=terrain.getLighting(position[i].x,position[i].z);
- if(!hidden){
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
- if(distance<1)glAlphaFunc(GL_GREATER, 0.2);
- }
- if(hidden){
- glDepthMask(0);
- glEnable(GL_BLEND);
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance/3);
- glAlphaFunc(GL_GREATER, 0);
- }
- model[i].drawdifftex(treetextureptr);
- }
- if(type[i]==bushtype){
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- terrainlight=terrain.getLighting(position[i].x,position[i].z);
- if(!hidden){
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
- if(distance<1)glAlphaFunc(GL_GREATER, 0.2);
- }
- if(hidden){
- glDepthMask(0);
- glEnable(GL_BLEND);
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance/3);
- glAlphaFunc(GL_GREATER, 0);
- }
- model[i].drawdifftex(bushtextureptr);
- }
- if(type[i]==treetrunktype){
- glEnable(GL_CULL_FACE);
- terrainlight=terrain.getLighting(position[i].x,position[i].z);
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
- model[i].drawdifftex(treetextureptr);
- }
- glPopMatrix();
- }
- }
- }
- }
- }
- }
-
- glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
- for(i=0;i<numobjects;i++){
- if(type[i]==treeleavestype||type[i]==bushtype){
- moved=DoRotation(model[i].boundingspherecenter,0,yaw[i],0);
- if(frustum.SphereInFrustum(position[i].x+moved.x,position[i].y+moved.y,position[i].z+moved.z,model[i].boundingsphereradius)){
- hidden=distsqflat(&viewer,&position[i])<=playerdist+3;
- if(hidden){
- distance=1;
- if(distance>0){
- if(1==1||occluded[i]<6){
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- glEnable(GL_LIGHTING);
- glDepthMask(1);
- glTranslatef(position[i].x,position[i].y,position[i].z);
- if(type[i]==bushtype){
- messedwith[i]-=multiplier;
- if(rotxvel[i]||rotx[i]){
- if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
- if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
- if(rotx[i]>0)rotxvel[i]-=multiplier*4;
- if(rotx[i]<0)rotxvel[i]+=multiplier*4;
- if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
- if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
- if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
- if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
- rotx[i]+=rotxvel[i]*multiplier*4;
- }
- if(rotyvel[i]||roty[i]){
- if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
- if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
- if(roty[i]>0)rotyvel[i]-=multiplier*4;
- if(roty[i]<0)rotyvel[i]+=multiplier*4;
- if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
- if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
- if(fabs(roty[i])<multiplier*4)roty[i]=0;
- if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
- roty[i]+=rotyvel[i]*multiplier*4;
- }
- if(roty[i]){
- glRotatef(roty[i],1,0,0);
- }
- if(rotx[i]){
- glRotatef(-rotx[i],0,0,1);
- }
- if(rotx[i]>10)rotx[i]=10;
- if(rotx[i]<-10)rotx[i]=-10;
- if(roty[i]>10)roty[i]=10;
- if(roty[i]<-10)roty[i]=-10;
- }
- if(type[i]==treetrunktype||type[i]==treeleavestype){
- messedwith[i]-=multiplier;
- if(rotxvel[i]||rotx[i]){
- if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
- if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
- if(rotx[i]>0)rotxvel[i]-=multiplier*4;
- if(rotx[i]<0)rotxvel[i]+=multiplier*4;
- if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
- if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
- if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
- if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
- rotx[i]+=rotxvel[i]*multiplier*4;
- }
- if(rotyvel[i]||roty[i]){
- if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
- if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
- if(roty[i]>0)rotyvel[i]-=multiplier*4;
- if(roty[i]<0)rotyvel[i]+=multiplier*4;
- if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
- if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
- if(fabs(roty[i])<multiplier*4)roty[i]=0;
- if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
- roty[i]+=rotyvel[i]*multiplier*4;
- }
- if(roty[i]){
- glRotatef(roty[i]/2,1,0,0);
- }
- if(rotx[i]){
- glRotatef(-rotx[i]/2,0,0,1);
- }
- if(rotx[i]>10)rotx[i]=10;
- if(rotx[i]<-10)rotx[i]=-10;
- if(roty[i]>10)roty[i]=10;
- if(roty[i]<-10)roty[i]=-10;
- }
- if(environment==snowyenvironment){
- if(type[i]==treeleavestype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*1.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- if(type[i]==treetrunktype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- if(type[i]==bushtype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*4*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- }
- if(environment==grassyenvironment){
- if(type[i]==treeleavestype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*1.5*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- if(type[i]==treetrunktype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*.5*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- if(type[i]==bushtype){
- glRotatef((sin(windvar+position[i].x*.3)+.5)*4*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
- }
- }
- glRotatef(yaw[i],0,1,0);
- glColor4f(1,1,1,distance);
- if(type[i]==treeleavestype){
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- terrainlight=terrain.getLighting(position[i].x,position[i].z);
- glDepthMask(0);
- glEnable(GL_BLEND);
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,.3);
- glAlphaFunc(GL_GREATER, 0);
- glDisable(GL_ALPHA_TEST);
- model[i].drawdifftex(treetextureptr);
- }
- if(type[i]==bushtype){
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- terrainlight=terrain.getLighting(position[i].x,position[i].z);
- glDepthMask(0);
- glEnable(GL_BLEND);
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,.3);
- glAlphaFunc(GL_GREATER, 0);
- glDisable(GL_ALPHA_TEST);
- model[i].drawdifftex(bushtextureptr);
- }
- glPopMatrix();
- }
- }
- }
- }
- }
- }
- if(environment==desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
- glEnable(GL_ALPHA_TEST);
- SetUpLight(&light,0);
+ static float distance;
+ static int i, j;
+ static XYZ moved, terrainlight;
+ bool hidden;
+
+ for (i = 0; i < numobjects; i++) {
+ if (type[i] != firetype) {
+ moved = DoRotation(model[i].boundingspherecenter, 0, yaw[i], 0);
+ if (type[i] == tunneltype || frustum.SphereInFrustum(position[i].x + moved.x, position[i].y + moved.y, position[i].z + moved.z, model[i].boundingsphereradius)) {
+ distance = distsq(&viewer, &position[i]);
+ distance *= 1.2;
+ hidden = !(distsqflat(&viewer, &position[i]) > playerdist + 3 || (type[i] != bushtype && type[i] != treeleavestype));
+ if (!hidden) {
+
+ if (detail == 2 && distance > viewdistance * viewdistance / 4 && environment == desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness );
+ else glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+ distance = (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance;
+ if (distance > 1)distance = 1;
+ if (distance > 0) {
+
+ /*if(checkcollide(viewer,DoRotation(model[i].vertex[model[i].vertexNum],0,yaw[i],0)*scale[i]+position[i],i)){
+ occluded[i]+=1;
+ }
+ else occluded[i]=0;*/
+ if (occluded[i] < 6) {
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ if (!model[i].color)glEnable(GL_LIGHTING);
+ else glDisable(GL_LIGHTING);
+ glDepthMask(1);
+ glTranslatef(position[i].x, position[i].y, position[i].z);
+ if (type[i] == bushtype) {
+ messedwith[i] -= multiplier;
+ if (rotxvel[i] || rotx[i]) {
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+ if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+ if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+ if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+ rotx[i] += rotxvel[i] * multiplier * 4;
+ }
+ if (rotyvel[i] || roty[i]) {
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+ if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+ if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+ if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+ if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+ roty[i] += rotyvel[i] * multiplier * 4;
+ }
+ if (roty[i]) {
+ glRotatef(roty[i], 1, 0, 0);
+ }
+ if (rotx[i]) {
+ glRotatef(-rotx[i], 0, 0, 1);
+ }
+ if (rotx[i] > 10)rotx[i] = 10;
+ if (rotx[i] < -10)rotx[i] = -10;
+ if (roty[i] > 10)roty[i] = 10;
+ if (roty[i] < -10)roty[i] = -10;
+ }
+ if (type[i] == treetrunktype || type[i] == treeleavestype) {
+ if (type[i] == treetrunktype || environment == 2) {
+ messedwith[i] -= multiplier;
+ if (rotxvel[i] || rotx[i]) {
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+ if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+ if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+ if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+ rotx[i] += rotxvel[i] * multiplier * 4;
+ }
+ if (rotyvel[i] || roty[i]) {
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+ if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+ if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+ if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+ if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+ roty[i] += rotyvel[i] * multiplier * 4;
+ }
+ if (roty[i]) {
+ glRotatef(roty[i] / 6, 1, 0, 0);
+ }
+ if (rotx[i]) {
+ glRotatef(-rotx[i] / 6, 0, 0, 1);
+ }
+ if (rotx[i] > 10)rotx[i] = 10;
+ if (rotx[i] < -10)rotx[i] = -10;
+ if (roty[i] > 10)roty[i] = 10;
+ if (roty[i] < -10)roty[i] = -10;
+ } else {
+ messedwith[i] -= multiplier;
+ if (rotxvel[i] || rotx[i]) {
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+ if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+ if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+ if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+ rotx[i] += rotxvel[i] * multiplier * 4;
+ }
+ if (rotyvel[i] || roty[i]) {
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+ if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+ if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+ if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+ if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+ roty[i] += rotyvel[i] * multiplier * 4;
+ }
+ if (roty[i]) {
+ glRotatef(roty[i] / 4, 1, 0, 0);
+ }
+ if (rotx[i]) {
+ glRotatef(-rotx[i] / 4, 0, 0, 1);
+ }
+ if (rotx[i] > 10)rotx[i] = 10;
+ if (rotx[i] < -10)rotx[i] = -10;
+ if (roty[i] > 10)roty[i] = 10;
+ if (roty[i] < -10)roty[i] = -10;
+ }
+
+ }
+ if (/*detail==2&&*/environment == snowyenvironment) {
+ if (type[i] == treeleavestype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 1.5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ if (type[i] == treetrunktype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5)*.5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ if (type[i] == bushtype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ }
+ if (/*detail==2&&*/environment == grassyenvironment) {
+ if (type[i] == treeleavestype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 1.5 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ if (type[i] == treetrunktype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5)*.5 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ if (type[i] == bushtype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ }
+ if (/*detail==2&&*/environment == desertenvironment) {
+ if (type[i] == bushtype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ }
+ glRotatef(yaw[i], 0, 1, 0);
+ if (distance > 1)distance = 1;
+ glColor4f((1 - shadowed[i]) / 2 + .5, (1 - shadowed[i]) / 2 + .5, (1 - shadowed[i]) / 2 + .5, distance);
+ if (distance >= 1) {
+ glDisable(GL_BLEND);
+ glAlphaFunc(GL_GREATER, 0.5);
+ }
+ if (distance < 1) {
+ glEnable(GL_BLEND);
+ glAlphaFunc(GL_GREATER, 0.1);
+ }
+ if (type[i] != treetrunktype && type[i] != treeleavestype && type[i] != bushtype && type[i] != rocktype) {
+ glEnable(GL_CULL_FACE);
+ glAlphaFunc(GL_GREATER, 0.0001);
+ model[i].drawdifftex(boxtextureptr);
+ model[i].drawdecals(terrain.shadowtexture, terrain.bloodtexture, terrain.bloodtexture2, terrain.breaktexture);
+ }
+ if (type[i] == rocktype) {
+ glEnable(GL_CULL_FACE);
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glColor4f((1 - shadowed[i]) / 2 + light.ambient[0], (1 - shadowed[i]) / 2 + light.ambient[1], (1 - shadowed[i]) / 2 + light.ambient[2], distance);
+ model[i].drawdifftex(rocktextureptr);
+ model[i].drawdecals(terrain.shadowtexture, terrain.bloodtexture, terrain.bloodtexture2, terrain.breaktexture);
+ }
+ if (type[i] == treeleavestype) {
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ terrainlight = terrain.getLighting(position[i].x, position[i].z);
+ if (!hidden) {
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+ if (distance < 1)glAlphaFunc(GL_GREATER, 0.2);
+ }
+ if (hidden) {
+ glDepthMask(0);
+ glEnable(GL_BLEND);
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance / 3);
+ glAlphaFunc(GL_GREATER, 0);
+ }
+ model[i].drawdifftex(treetextureptr);
+ }
+ if (type[i] == bushtype) {
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ terrainlight = terrain.getLighting(position[i].x, position[i].z);
+ if (!hidden) {
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+ if (distance < 1)glAlphaFunc(GL_GREATER, 0.2);
+ }
+ if (hidden) {
+ glDepthMask(0);
+ glEnable(GL_BLEND);
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance / 3);
+ glAlphaFunc(GL_GREATER, 0);
+ }
+ model[i].drawdifftex(bushtextureptr);
+ }
+ if (type[i] == treetrunktype) {
+ glEnable(GL_CULL_FACE);
+ terrainlight = terrain.getLighting(position[i].x, position[i].z);
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+ model[i].drawdifftex(treetextureptr);
+ }
+ glPopMatrix();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+ for (i = 0; i < numobjects; i++) {
+ if (type[i] == treeleavestype || type[i] == bushtype) {
+ moved = DoRotation(model[i].boundingspherecenter, 0, yaw[i], 0);
+ if (frustum.SphereInFrustum(position[i].x + moved.x, position[i].y + moved.y, position[i].z + moved.z, model[i].boundingsphereradius)) {
+ hidden = distsqflat(&viewer, &position[i]) <= playerdist + 3;
+ if (hidden) {
+ distance = 1;
+ if (distance > 0) {
+ if (1 == 1 || occluded[i] < 6) {
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ glEnable(GL_LIGHTING);
+ glDepthMask(1);
+ glTranslatef(position[i].x, position[i].y, position[i].z);
+ if (type[i] == bushtype) {
+ messedwith[i] -= multiplier;
+ if (rotxvel[i] || rotx[i]) {
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+ if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+ if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+ if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+ rotx[i] += rotxvel[i] * multiplier * 4;
+ }
+ if (rotyvel[i] || roty[i]) {
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+ if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+ if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+ if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+ if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+ roty[i] += rotyvel[i] * multiplier * 4;
+ }
+ if (roty[i]) {
+ glRotatef(roty[i], 1, 0, 0);
+ }
+ if (rotx[i]) {
+ glRotatef(-rotx[i], 0, 0, 1);
+ }
+ if (rotx[i] > 10)rotx[i] = 10;
+ if (rotx[i] < -10)rotx[i] = -10;
+ if (roty[i] > 10)roty[i] = 10;
+ if (roty[i] < -10)roty[i] = -10;
+ }
+ if (type[i] == treetrunktype || type[i] == treeleavestype) {
+ messedwith[i] -= multiplier;
+ if (rotxvel[i] || rotx[i]) {
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+ if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+ if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+ if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+ if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+ if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+ rotx[i] += rotxvel[i] * multiplier * 4;
+ }
+ if (rotyvel[i] || roty[i]) {
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+ if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+ if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+ if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+ if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+ if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+ if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+ roty[i] += rotyvel[i] * multiplier * 4;
+ }
+ if (roty[i]) {
+ glRotatef(roty[i] / 2, 1, 0, 0);
+ }
+ if (rotx[i]) {
+ glRotatef(-rotx[i] / 2, 0, 0, 1);
+ }
+ if (rotx[i] > 10)rotx[i] = 10;
+ if (rotx[i] < -10)rotx[i] = -10;
+ if (roty[i] > 10)roty[i] = 10;
+ if (roty[i] < -10)roty[i] = -10;
+ }
+ if (environment == snowyenvironment) {
+ if (type[i] == treeleavestype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 1.5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ if (type[i] == treetrunktype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5)*.5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ if (type[i] == bushtype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ }
+ if (environment == grassyenvironment) {
+ if (type[i] == treeleavestype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 1.5 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ if (type[i] == treetrunktype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5)*.5 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ if (type[i] == bushtype) {
+ glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+ }
+ }
+ glRotatef(yaw[i], 0, 1, 0);
+ glColor4f(1, 1, 1, distance);
+ if (type[i] == treeleavestype) {
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ terrainlight = terrain.getLighting(position[i].x, position[i].z);
+ glDepthMask(0);
+ glEnable(GL_BLEND);
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, .3);
+ glAlphaFunc(GL_GREATER, 0);
+ glDisable(GL_ALPHA_TEST);
+ model[i].drawdifftex(treetextureptr);
+ }
+ if (type[i] == bushtype) {
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ terrainlight = terrain.getLighting(position[i].x, position[i].z);
+ glDepthMask(0);
+ glEnable(GL_BLEND);
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, .3);
+ glAlphaFunc(GL_GREATER, 0);
+ glDisable(GL_ALPHA_TEST);
+ model[i].drawdifftex(bushtextureptr);
+ }
+ glPopMatrix();
+ }
+ }
+ }
+ }
+ }
+ }
+ if (environment == desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+ glEnable(GL_ALPHA_TEST);
+ SetUpLight(&light, 0);
}
void Objects::DeleteObject(int which)
{
- type[numobjects-1]=0;
- yaw[numobjects-1]=0;
- position[numobjects-1]=0;
- scale[numobjects-1]=0;
- friction[numobjects-1]=0;
+ type[numobjects - 1] = 0;
+ yaw[numobjects - 1] = 0;
+ position[numobjects - 1] = 0;
+ scale[numobjects - 1] = 0;
+ friction[numobjects - 1] = 0;
- numobjects--;
+ numobjects--;
}
-void Objects::MakeObject(int atype, XYZ where, float ayaw, float ascale){
- if((atype!=treeleavestype&&atype!=bushtype)||foliage==1){
- scale[numobjects]=ascale;
- if(atype==treeleavestype)scale[numobjects]+=fabs((float)(Random()%100)/900)*ascale;
-
- onfire[numobjects]=0;
- flamedelay[numobjects]=0;
- type[numobjects]=atype;
-
- if(atype==firetype)onfire[numobjects]=1;
-
- position[numobjects]=where;
- if(atype==bushtype)position[numobjects].y=terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3;
- yaw[numobjects]=ayaw;
-
- rotxvel[numobjects]=0;
- rotyvel[numobjects]=0;
- rotx[numobjects]=0;
- roty[numobjects]=0;
-
- if(atype==boxtype)model[numobjects].loaddecal((char *)":Data:Models:Box.solid",0);
- if(atype==cooltype)model[numobjects].loaddecal((char *)":Data:Models:Cool.solid",0);
- if(atype==walltype)model[numobjects].loaddecal((char *)":Data:Models:Wall.solid",0);
- if(atype==tunneltype)model[numobjects].loaddecal((char *)":Data:Models:Tunnel.solid",0);
- if(atype==chimneytype)model[numobjects].loaddecal((char *)":Data:Models:Chimney.solid",0);
- if(atype==spiketype)model[numobjects].load((char *)":Data:Models:Spike.solid",0);
- if(atype==weirdtype)model[numobjects].loaddecal((char *)":Data:Models:Weird.solid",0);
- if(atype==rocktype)model[numobjects].loaddecal((char *)":Data:Models:Rock.solid",0);
- if(atype==treetrunktype)model[numobjects].load((char *)":Data:Models:Treetrunk.solid",0);
- if(atype==treeleavestype)model[numobjects].load((char *)":Data:Models:Leaves.solid",0);
- if(atype==bushtype)model[numobjects].load((char *)":Data:Models:Bush.solid",0);
-
- if(atype==boxtype)friction[numobjects]=1.5;
- if(atype==cooltype)friction[numobjects]=1.5;
- if(atype==walltype)friction[numobjects]=1.5;
- if(atype==platformtype)friction[numobjects]=1.5;
- if(atype==tunneltype)friction[numobjects]=1.5;
- if(atype==chimneytype)friction[numobjects]=1.5;
- if(atype==rocktype)friction[numobjects]=.5;
- if(atype==rocktype&&ascale>.5)friction[numobjects]=1.5;
- if(atype==weirdtype)friction[numobjects]=1.5;
- if(atype==spiketype)friction[numobjects]=.4;
- if(atype==treetrunktype)friction[numobjects]=.4;
- if(atype==treeleavestype)friction[numobjects]=0;
-
- if(atype==platformtype){
- model[numobjects].loaddecal((char *)":Data:Models:Platform.solid",0);
- model[numobjects].Rotate(90,0,0);
- }
-
- if(type[numobjects]==boxtype||type[numobjects]==cooltype||type[numobjects]==spiketype||type[numobjects]==weirdtype||type[numobjects]==walltype||type[numobjects]==chimneytype||type[numobjects]==tunneltype||type[numobjects]==platformtype){
- model[numobjects].ScaleTexCoords(scale[numobjects]*1.5);
- }
- if(type[numobjects]==rocktype){
- model[numobjects].ScaleTexCoords(scale[numobjects]*3);
- }
- model[numobjects].flat=1;
- if(atype==treetrunktype||atype==treeleavestype||atype==rocktype){
- model[numobjects].flat=0;
- }
- model[numobjects].Scale(.3*scale[numobjects],.3*scale[numobjects],.3*scale[numobjects]);
- model[numobjects].Rotate(90,1,1);
- if(type[numobjects]==rocktype){
- model[numobjects].Rotate(ayaw*5,1,1);
- }
- model[numobjects].CalculateNormals(1);
- model[numobjects].ScaleNormals(-1,-1,-1);
-
- if(atype==treetrunktype&&position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)+1){
- if(detail==2)terrain.MakeDecal(shadowdecalpermanent,position[numobjects],2,.4,0);
- }
-
- if(atype==bushtype&&position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)+1){
- if(detail==2)terrain.MakeDecal(shadowdecalpermanent,position[numobjects],1,.4,0);
- }
-
- if(atype!=treeleavestype&&atype!=bushtype&&atype!=firetype)
- terrain.AddObject(where+DoRotation(model[numobjects].boundingspherecenter,0,ayaw,0),model[numobjects].boundingsphereradius,numobjects);
-
- numobjects++;
- }
+void Objects::MakeObject(int atype, XYZ where, float ayaw, float ascale)
+{
+ if ((atype != treeleavestype && atype != bushtype) || foliage == 1) {
+ scale[numobjects] = ascale;
+ if (atype == treeleavestype)scale[numobjects] += fabs((float)(Random() % 100) / 900) * ascale;
+
+ onfire[numobjects] = 0;
+ flamedelay[numobjects] = 0;
+ type[numobjects] = atype;
+
+ if (atype == firetype)onfire[numobjects] = 1;
+
+ position[numobjects] = where;
+ if (atype == bushtype)position[numobjects].y = terrain.getHeight(position[numobjects].x, position[numobjects].z) - .3;
+ yaw[numobjects] = ayaw;
+
+ rotxvel[numobjects] = 0;
+ rotyvel[numobjects] = 0;
+ rotx[numobjects] = 0;
+ roty[numobjects] = 0;
+
+ if (atype == boxtype)model[numobjects].loaddecal((char *)":Data:Models:Box.solid", 0);
+ if (atype == cooltype)model[numobjects].loaddecal((char *)":Data:Models:Cool.solid", 0);
+ if (atype == walltype)model[numobjects].loaddecal((char *)":Data:Models:Wall.solid", 0);
+ if (atype == tunneltype)model[numobjects].loaddecal((char *)":Data:Models:Tunnel.solid", 0);
+ if (atype == chimneytype)model[numobjects].loaddecal((char *)":Data:Models:Chimney.solid", 0);
+ if (atype == spiketype)model[numobjects].load((char *)":Data:Models:Spike.solid", 0);
+ if (atype == weirdtype)model[numobjects].loaddecal((char *)":Data:Models:Weird.solid", 0);
+ if (atype == rocktype)model[numobjects].loaddecal((char *)":Data:Models:Rock.solid", 0);
+ if (atype == treetrunktype)model[numobjects].load((char *)":Data:Models:Treetrunk.solid", 0);
+ if (atype == treeleavestype)model[numobjects].load((char *)":Data:Models:Leaves.solid", 0);
+ if (atype == bushtype)model[numobjects].load((char *)":Data:Models:Bush.solid", 0);
+
+ if (atype == boxtype)friction[numobjects] = 1.5;
+ if (atype == cooltype)friction[numobjects] = 1.5;
+ if (atype == walltype)friction[numobjects] = 1.5;
+ if (atype == platformtype)friction[numobjects] = 1.5;
+ if (atype == tunneltype)friction[numobjects] = 1.5;
+ if (atype == chimneytype)friction[numobjects] = 1.5;
+ if (atype == rocktype)friction[numobjects] = .5;
+ if (atype == rocktype && ascale > .5)friction[numobjects] = 1.5;
+ if (atype == weirdtype)friction[numobjects] = 1.5;
+ if (atype == spiketype)friction[numobjects] = .4;
+ if (atype == treetrunktype)friction[numobjects] = .4;
+ if (atype == treeleavestype)friction[numobjects] = 0;
+
+ if (atype == platformtype) {
+ model[numobjects].loaddecal((char *)":Data:Models:Platform.solid", 0);
+ model[numobjects].Rotate(90, 0, 0);
+ }
+
+ if (type[numobjects] == boxtype || type[numobjects] == cooltype || type[numobjects] == spiketype || type[numobjects] == weirdtype || type[numobjects] == walltype || type[numobjects] == chimneytype || type[numobjects] == tunneltype || type[numobjects] == platformtype) {
+ model[numobjects].ScaleTexCoords(scale[numobjects] * 1.5);
+ }
+ if (type[numobjects] == rocktype) {
+ model[numobjects].ScaleTexCoords(scale[numobjects] * 3);
+ }
+ model[numobjects].flat = 1;
+ if (atype == treetrunktype || atype == treeleavestype || atype == rocktype) {
+ model[numobjects].flat = 0;
+ }
+ model[numobjects].Scale(.3 * scale[numobjects], .3 * scale[numobjects], .3 * scale[numobjects]);
+ model[numobjects].Rotate(90, 1, 1);
+ if (type[numobjects] == rocktype) {
+ model[numobjects].Rotate(ayaw * 5, 1, 1);
+ }
+ model[numobjects].CalculateNormals(1);
+ model[numobjects].ScaleNormals(-1, -1, -1);
+
+ if (atype == treetrunktype && position[numobjects].y < terrain.getHeight(position[numobjects].x, position[numobjects].z) + 1) {
+ if (detail == 2)terrain.MakeDecal(shadowdecalpermanent, position[numobjects], 2, .4, 0);
+ }
+
+ if (atype == bushtype && position[numobjects].y < terrain.getHeight(position[numobjects].x, position[numobjects].z) + 1) {
+ if (detail == 2)terrain.MakeDecal(shadowdecalpermanent, position[numobjects], 1, .4, 0);
+ }
+
+ if (atype != treeleavestype && atype != bushtype && atype != firetype)
+ terrain.AddObject(where + DoRotation(model[numobjects].boundingspherecenter, 0, ayaw, 0), model[numobjects].boundingsphereradius, numobjects);
+
+ numobjects++;
+ }
}
-void Objects::MakeObject(int atype, XYZ where, float ayaw, float apitch, float ascale){
- if((atype!=treeleavestype&&atype!=bushtype)||foliage==1){
- scale[numobjects]=ascale;
- if(atype==treeleavestype)scale[numobjects]+=fabs((float)(Random()%100)/900)*ascale;
-
- onfire[numobjects]=0;
- flamedelay[numobjects]=0;
- type[numobjects]=atype;
-
- if(atype==firetype)onfire[numobjects]=1;
-
- position[numobjects]=where;
- if(atype==bushtype)position[numobjects].y=terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3;
- /*if(atype==firetype){
- if(position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3)
- position[numobjects].y=terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3;
- }*/
- yaw[numobjects]=ayaw;
- pitch[numobjects]=apitch;
-
- rotxvel[numobjects]=0;
- rotyvel[numobjects]=0;
- rotx[numobjects]=0;
- roty[numobjects]=0;
-
- if(atype==boxtype)model[numobjects].loaddecal((char *)":Data:Models:Box.solid",0);
- if(atype==cooltype)model[numobjects].loaddecal((char *)":Data:Models:Cool.solid",0);
- if(atype==walltype)model[numobjects].loaddecal((char *)":Data:Models:Wall.solid",0);
- if(atype==tunneltype)model[numobjects].loaddecal((char *)":Data:Models:Tunnel.solid",0);
- if(atype==chimneytype)model[numobjects].loaddecal((char *)":Data:Models:Chimney.solid",0);
- if(atype==spiketype)model[numobjects].load((char *)":Data:Models:Spike.solid",0);
- if(atype==weirdtype)model[numobjects].loaddecal((char *)":Data:Models:Weird.solid",0);
- if(atype==rocktype)model[numobjects].loaddecal((char *)":Data:Models:Rock.solid",0);
- if(atype==treetrunktype)model[numobjects].load((char *)":Data:Models:Treetrunk.solid",0);
- if(atype==treeleavestype)model[numobjects].load((char *)":Data:Models:Leaves.solid",0);
- if(atype==bushtype)model[numobjects].load((char *)":Data:Models:Bush.solid",0);
-
- if(atype==boxtype)friction[numobjects]=1.5;
- if(atype==cooltype)friction[numobjects]=1.5;
- if(atype==walltype)friction[numobjects]=1.5;
- if(atype==platformtype)friction[numobjects]=1.5;
- if(atype==tunneltype)friction[numobjects]=1.5;
- if(atype==chimneytype)friction[numobjects]=1.5;
- if(atype==rocktype)friction[numobjects]=.5;
- if(atype==rocktype&&ascale>.5)friction[numobjects]=1.5;
- if(atype==weirdtype)friction[numobjects]=1.5;
- if(atype==spiketype)friction[numobjects]=.4;
- if(atype==treetrunktype)friction[numobjects]=.4;
- if(atype==treeleavestype)friction[numobjects]=0;
-
- if(friction[numobjects]==1.5&&fabs(apitch)>5)friction[numobjects]=.5;
-
- if(atype==platformtype){
- model[numobjects].loaddecal((char *)":Data:Models:Platform.solid",0);
- model[numobjects].Rotate(90,0,0);
- }
-
- if(type[numobjects]==boxtype||type[numobjects]==cooltype||type[numobjects]==spiketype||type[numobjects]==weirdtype||type[numobjects]==walltype||type[numobjects]==chimneytype||type[numobjects]==tunneltype||type[numobjects]==platformtype){
- model[numobjects].ScaleTexCoords(scale[numobjects]*1.5);
- }
- if(type[numobjects]==rocktype){
- model[numobjects].ScaleTexCoords(scale[numobjects]*3);
- }
- model[numobjects].flat=1;
- if(atype==treetrunktype||atype==treeleavestype||atype==rocktype){
- model[numobjects].flat=0;
- }
- model[numobjects].Scale(.3*scale[numobjects],.3*scale[numobjects],.3*scale[numobjects]);
- model[numobjects].Rotate(90,1,1);
- model[numobjects].Rotate(apitch,0,0);
- if(type[numobjects]==rocktype){
- model[numobjects].Rotate(ayaw*5,0,0);
- }
- model[numobjects].CalculateNormals(1);
- model[numobjects].ScaleNormals(-1,-1,-1);
-
- if(atype==treetrunktype&&position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)+1){
- if(detail==2)terrain.MakeDecal(shadowdecalpermanent,position[numobjects],2,.4,0);
- }
-
- if(atype==bushtype&&position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)+1){
- if(detail==2)terrain.MakeDecal(shadowdecalpermanent,position[numobjects],1,.4,0);
- }
-
- if(atype!=treeleavestype&&atype!=bushtype&&atype!=firetype)
- terrain.AddObject(where+DoRotation(model[numobjects].boundingspherecenter,0,ayaw,0),model[numobjects].boundingsphereradius,numobjects);
-
- numobjects++;
- }
+void Objects::MakeObject(int atype, XYZ where, float ayaw, float apitch, float ascale)
+{
+ if ((atype != treeleavestype && atype != bushtype) || foliage == 1) {
+ scale[numobjects] = ascale;
+ if (atype == treeleavestype)scale[numobjects] += fabs((float)(Random() % 100) / 900) * ascale;
+
+ onfire[numobjects] = 0;
+ flamedelay[numobjects] = 0;
+ type[numobjects] = atype;
+
+ if (atype == firetype)onfire[numobjects] = 1;
+
+ position[numobjects] = where;
+ if (atype == bushtype)position[numobjects].y = terrain.getHeight(position[numobjects].x, position[numobjects].z) - .3;
+ /*if(atype==firetype){
+ if(position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3)
+ position[numobjects].y=terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3;
+ }*/
+ yaw[numobjects] = ayaw;
+ pitch[numobjects] = apitch;
+
+ rotxvel[numobjects] = 0;
+ rotyvel[numobjects] = 0;
+ rotx[numobjects] = 0;
+ roty[numobjects] = 0;
+
+ if (atype == boxtype)model[numobjects].loaddecal((char *)":Data:Models:Box.solid", 0);
+ if (atype == cooltype)model[numobjects].loaddecal((char *)":Data:Models:Cool.solid", 0);
+ if (atype == walltype)model[numobjects].loaddecal((char *)":Data:Models:Wall.solid", 0);
+ if (atype == tunneltype)model[numobjects].loaddecal((char *)":Data:Models:Tunnel.solid", 0);
+ if (atype == chimneytype)model[numobjects].loaddecal((char *)":Data:Models:Chimney.solid", 0);
+ if (atype == spiketype)model[numobjects].load((char *)":Data:Models:Spike.solid", 0);
+ if (atype == weirdtype)model[numobjects].loaddecal((char *)":Data:Models:Weird.solid", 0);
+ if (atype == rocktype)model[numobjects].loaddecal((char *)":Data:Models:Rock.solid", 0);
+ if (atype == treetrunktype)model[numobjects].load((char *)":Data:Models:Treetrunk.solid", 0);
+ if (atype == treeleavestype)model[numobjects].load((char *)":Data:Models:Leaves.solid", 0);
+ if (atype == bushtype)model[numobjects].load((char *)":Data:Models:Bush.solid", 0);
+
+ if (atype == boxtype)friction[numobjects] = 1.5;
+ if (atype == cooltype)friction[numobjects] = 1.5;
+ if (atype == walltype)friction[numobjects] = 1.5;
+ if (atype == platformtype)friction[numobjects] = 1.5;
+ if (atype == tunneltype)friction[numobjects] = 1.5;
+ if (atype == chimneytype)friction[numobjects] = 1.5;
+ if (atype == rocktype)friction[numobjects] = .5;
+ if (atype == rocktype && ascale > .5)friction[numobjects] = 1.5;
+ if (atype == weirdtype)friction[numobjects] = 1.5;
+ if (atype == spiketype)friction[numobjects] = .4;
+ if (atype == treetrunktype)friction[numobjects] = .4;
+ if (atype == treeleavestype)friction[numobjects] = 0;
+
+ if (friction[numobjects] == 1.5 && fabs(apitch) > 5)friction[numobjects] = .5;
+
+ if (atype == platformtype) {
+ model[numobjects].loaddecal((char *)":Data:Models:Platform.solid", 0);
+ model[numobjects].Rotate(90, 0, 0);
+ }
+
+ if (type[numobjects] == boxtype || type[numobjects] == cooltype || type[numobjects] == spiketype || type[numobjects] == weirdtype || type[numobjects] == walltype || type[numobjects] == chimneytype || type[numobjects] == tunneltype || type[numobjects] == platformtype) {
+ model[numobjects].ScaleTexCoords(scale[numobjects] * 1.5);
+ }
+ if (type[numobjects] == rocktype) {
+ model[numobjects].ScaleTexCoords(scale[numobjects] * 3);
+ }
+ model[numobjects].flat = 1;
+ if (atype == treetrunktype || atype == treeleavestype || atype == rocktype) {
+ model[numobjects].flat = 0;
+ }
+ model[numobjects].Scale(.3 * scale[numobjects], .3 * scale[numobjects], .3 * scale[numobjects]);
+ model[numobjects].Rotate(90, 1, 1);
+ model[numobjects].Rotate(apitch, 0, 0);
+ if (type[numobjects] == rocktype) {
+ model[numobjects].Rotate(ayaw * 5, 0, 0);
+ }
+ model[numobjects].CalculateNormals(1);
+ model[numobjects].ScaleNormals(-1, -1, -1);
+
+ if (atype == treetrunktype && position[numobjects].y < terrain.getHeight(position[numobjects].x, position[numobjects].z) + 1) {
+ if (detail == 2)terrain.MakeDecal(shadowdecalpermanent, position[numobjects], 2, .4, 0);
+ }
+
+ if (atype == bushtype && position[numobjects].y < terrain.getHeight(position[numobjects].x, position[numobjects].z) + 1) {
+ if (detail == 2)terrain.MakeDecal(shadowdecalpermanent, position[numobjects], 1, .4, 0);
+ }
+
+ if (atype != treeleavestype && atype != bushtype && atype != firetype)
+ terrain.AddObject(where + DoRotation(model[numobjects].boundingspherecenter, 0, ayaw, 0), model[numobjects].boundingsphereradius, numobjects);
+
+ numobjects++;
+ }
}
void Objects::DoStuff()
{
- XYZ spawnpoint;
- for(int i=0;i<numobjects;i++){
- /*if(type[i]==firetype){
- Sprite::MakeSprite(weaponshinesprite, position[i],position[i]*0, 1,1,1, 5, 1);
- }*/
-
- if(type[i]==firetype)onfire[i]=1;
- if(onfire[i]){
- if(type[i]==bushtype)flamedelay[i]-=multiplier*3;
- if(type[i]==firetype)flamedelay[i]-=multiplier*3;
- if(type[i]==treeleavestype)flamedelay[i]-=multiplier*4;
- while(flamedelay[i]<0&&onfire[i]){
- flamedelay[i]+=.006;
- if(type[i]==bushtype||type[i]==firetype){
- spawnpoint.x=((float)(Random()%100))/30*scale[i];
- spawnpoint.y=((float)(Random()%100)+60)/30*scale[i];
- spawnpoint.z=0;
- spawnpoint=DoRotation(spawnpoint,0,Random()%360,0);
- spawnpoint+=position[i];
- Sprite::MakeSprite(flamesprite, spawnpoint,spawnpoint*0, 1,1,1, (.6+(float)abs(Random()%100)/200-.25)*5*scale[i], 1);
- }
- if(type[i]==treeleavestype){
- spawnpoint.x=((float)(Random()%100))/80*scale[i];
- spawnpoint.y=((float)(Random()%100)+80)/12*scale[i];
- spawnpoint.z=0;
- spawnpoint=DoRotation(spawnpoint,0,Random()%360,0);
- spawnpoint+=position[i];
- Sprite::MakeSprite(flamesprite, spawnpoint,spawnpoint*0, 1,1,1, (.6+(float)abs(Random()%100)/200-.25)*6, 1);
- }
- }
-
- }
- }
+ XYZ spawnpoint;
+ for (int i = 0; i < numobjects; i++) {
+ /*if(type[i]==firetype){
+ Sprite::MakeSprite(weaponshinesprite, position[i],position[i]*0, 1,1,1, 5, 1);
+ }*/
+
+ if (type[i] == firetype)onfire[i] = 1;
+ if (onfire[i]) {
+ if (type[i] == bushtype)flamedelay[i] -= multiplier * 3;
+ if (type[i] == firetype)flamedelay[i] -= multiplier * 3;
+ if (type[i] == treeleavestype)flamedelay[i] -= multiplier * 4;
+ while (flamedelay[i] < 0 && onfire[i]) {
+ flamedelay[i] += .006;
+ if (type[i] == bushtype || type[i] == firetype) {
+ spawnpoint.x = ((float)(Random() % 100)) / 30 * scale[i];
+ spawnpoint.y = ((float)(Random() % 100) + 60) / 30 * scale[i];
+ spawnpoint.z = 0;
+ spawnpoint = DoRotation(spawnpoint, 0, Random() % 360, 0);
+ spawnpoint += position[i];
+ Sprite::MakeSprite(flamesprite, spawnpoint, spawnpoint * 0, 1, 1, 1, (.6 + (float)abs(Random() % 100) / 200 - .25) * 5 * scale[i], 1);
+ }
+ if (type[i] == treeleavestype) {
+ spawnpoint.x = ((float)(Random() % 100)) / 80 * scale[i];
+ spawnpoint.y = ((float)(Random() % 100) + 80) / 12 * scale[i];
+ spawnpoint.z = 0;
+ spawnpoint = DoRotation(spawnpoint, 0, Random() % 360, 0);
+ spawnpoint += position[i];
+ Sprite::MakeSprite(flamesprite, spawnpoint, spawnpoint * 0, 1, 1, 1, (.6 + (float)abs(Random() % 100) / 200 - .25) * 6, 1);
+ }
+ }
+
+ }
+ }
}
void Objects::DoShadows()
{
- int i,j,k,l;
- static XYZ testpoint,testpoint2, terrainpoint,lightloc,col;
- lightloc=light.location;
- if(!skyboxtexture)lightloc=0;
- lightloc.y+=10;
- Normalise(&lightloc);
- int patchx,patchz;
-
- if(numobjects>0)
- for(i=0;i<numobjects;i++){
- if(type[i]!=treeleavestype&&type[i]!=treetrunktype&&type[i]!=bushtype&&type[i]!=firetype){
- for(j=0;j<model[i].vertexNum;j++){
- terrainpoint=position[i]+DoRotation(model[i].vertex[j]+model[i].normals[j]*.1,0,yaw[i],0);
- //terrainpoint.y+=model[i].boundingsphereradius;
- shadowed[i]=0;
- patchx=terrainpoint.x/(terrain.size/subdivision*terrain.scale);
- patchz=terrainpoint.z/(terrain.size/subdivision*terrain.scale);
- if(patchx>=0&&patchz>=0&&patchx<subdivision&&patchz<subdivision)
- if(terrain.patchobjectnum[patchx][patchz])
- for(k=0;k<terrain.patchobjectnum[patchx][patchz];k++){
- l=terrain.patchobjects[patchx][patchz][k];
- if(type[l]!=treetrunktype/*&&l!=i*/){
- testpoint=terrainpoint;
- testpoint2=terrainpoint+lightloc*50*(1-shadowed[i]);
- if(model[l].LineCheck(&testpoint,&testpoint2,&col,&position[l],&yaw[l])!=-1){
- shadowed[i]=1-(findDistance(&terrainpoint,&col)/50);
- }
- }
- }
- if(shadowed[i]>0){
- col=model[i].normals[j]-DoRotation(lightloc*shadowed[i],0,-yaw[i],0);
- Normalise(&col);
- for(k=0;k<model[i].TriangleNum;k++){
- if(model[i].Triangles[k].vertex[0]==j){
- l=k*24;
- model[i].vArray[l+2]=col.x;
- model[i].vArray[l+3]=col.y;
- model[i].vArray[l+4]=col.z;
- }
- if(model[i].Triangles[k].vertex[1]==j){
- l=k*24;
- model[i].vArray[l+10]=col.x;
- model[i].vArray[l+11]=col.y;
- model[i].vArray[l+12]=col.z;
- }
- if(model[i].Triangles[k].vertex[2]==j){
- l=k*24;
- model[i].vArray[l+18]=col.x;
- model[i].vArray[l+19]=col.y;
- model[i].vArray[l+20]=col.z;
- }
- }
- }
- }
- }
- shadowed[i]=0;
- }
+ int i, j, k, l;
+ static XYZ testpoint, testpoint2, terrainpoint, lightloc, col;
+ lightloc = light.location;
+ if (!skyboxtexture)lightloc = 0;
+ lightloc.y += 10;
+ Normalise(&lightloc);
+ int patchx, patchz;
+
+ if (numobjects > 0)
+ for (i = 0; i < numobjects; i++) {
+ if (type[i] != treeleavestype && type[i] != treetrunktype && type[i] != bushtype && type[i] != firetype) {
+ for (j = 0; j < model[i].vertexNum; j++) {
+ terrainpoint = position[i] + DoRotation(model[i].vertex[j] + model[i].normals[j] * .1, 0, yaw[i], 0);
+ //terrainpoint.y+=model[i].boundingsphereradius;
+ shadowed[i] = 0;
+ patchx = terrainpoint.x / (terrain.size / subdivision * terrain.scale);
+ patchz = terrainpoint.z / (terrain.size / subdivision * terrain.scale);
+ if (patchx >= 0 && patchz >= 0 && patchx < subdivision && patchz < subdivision)
+ if (terrain.patchobjectnum[patchx][patchz])
+ for (k = 0; k < terrain.patchobjectnum[patchx][patchz]; k++) {
+ l = terrain.patchobjects[patchx][patchz][k];
+ if (type[l] != treetrunktype/*&&l!=i*/) {
+ testpoint = terrainpoint;
+ testpoint2 = terrainpoint + lightloc * 50 * (1 - shadowed[i]);
+ if (model[l].LineCheck(&testpoint, &testpoint2, &col, &position[l], &yaw[l]) != -1) {
+ shadowed[i] = 1 - (findDistance(&terrainpoint, &col) / 50);
+ }
+ }
+ }
+ if (shadowed[i] > 0) {
+ col = model[i].normals[j] - DoRotation(lightloc * shadowed[i], 0, -yaw[i], 0);
+ Normalise(&col);
+ for (k = 0; k < model[i].TriangleNum; k++) {
+ if (model[i].Triangles[k].vertex[0] == j) {
+ l = k * 24;
+ model[i].vArray[l + 2] = col.x;
+ model[i].vArray[l + 3] = col.y;
+ model[i].vArray[l + 4] = col.z;
+ }
+ if (model[i].Triangles[k].vertex[1] == j) {
+ l = k * 24;
+ model[i].vArray[l + 10] = col.x;
+ model[i].vArray[l + 11] = col.y;
+ model[i].vArray[l + 12] = col.z;
+ }
+ if (model[i].Triangles[k].vertex[2] == j) {
+ l = k * 24;
+ model[i].vArray[l + 18] = col.x;
+ model[i].vArray[l + 19] = col.y;
+ model[i].vArray[l + 20] = col.z;
+ }
+ }
+ }
+ }
+ }
+ shadowed[i] = 0;
+ }
}
Objects::Objects()
{
- center = 0;
- radius = 0;
- numobjects = 0;
-
- memset(position, 0, sizeof(position));
- memset(type, 0, sizeof(type));
- memset(yaw, 0, sizeof(yaw));
- memset(pitch, 0, sizeof(pitch));
- memset(rotx, 0, sizeof(rotx));
- memset(rotxvel, 0, sizeof(rotxvel));
- memset(roty, 0, sizeof(roty));
- memset(rotyvel, 0, sizeof(rotyvel));
- memset(possible, 0, sizeof(possible));
- memset(model, 0, sizeof(model));
- memset(displaymodel, 0, sizeof(displaymodel));
- memset(friction, 0, sizeof(friction));
- memset(scale, 0, sizeof(scale));
- memset(messedwith, 0, sizeof(messedwith));
- memset(checked, 0, sizeof(checked));
- memset(shadowed, 0, sizeof(shadowed));
- memset(occluded, 0, sizeof(occluded));
- memset(onfire, 0, sizeof(onfire));
- memset(flamedelay, 0, sizeof(flamedelay));
-}
+ center = 0;
+ radius = 0;
+ numobjects = 0;
+
+ memset(position, 0, sizeof(position));
+ memset(type, 0, sizeof(type));
+ memset(yaw, 0, sizeof(yaw));
+ memset(pitch, 0, sizeof(pitch));
+ memset(rotx, 0, sizeof(rotx));
+ memset(rotxvel, 0, sizeof(rotxvel));
+ memset(roty, 0, sizeof(roty));
+ memset(rotyvel, 0, sizeof(rotyvel));
+ memset(possible, 0, sizeof(possible));
+ memset(model, 0, sizeof(model));
+ memset(displaymodel, 0, sizeof(displaymodel));
+ memset(friction, 0, sizeof(friction));
+ memset(scale, 0, sizeof(scale));
+ memset(messedwith, 0, sizeof(messedwith));
+ memset(checked, 0, sizeof(checked));
+ memset(shadowed, 0, sizeof(shadowed));
+ memset(occluded, 0, sizeof(occluded));
+ memset(onfire, 0, sizeof(onfire));
+ memset(flamedelay, 0, sizeof(flamedelay));
+}
Objects::~Objects()
{
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#define firetype 13
-class Objects{
+class Objects
+{
public:
- XYZ center;
- float radius;
- XYZ position[max_objects];
- int type[max_objects];
- float yaw[max_objects];
- float pitch[max_objects];
- float rotx[max_objects];
- float rotxvel[max_objects];
- float roty[max_objects];
- float rotyvel[max_objects];
- int numobjects;
- bool possible[max_objects];
- Model model[max_objects];
- Model displaymodel[max_objects];
- float friction[max_objects];
- float scale[max_objects];
- float messedwith[max_objects];
- float checked[max_objects];
- Texture boxtextureptr;
- Texture treetextureptr;
- Texture bushtextureptr;
- Texture rocktextureptr;
- float shadowed[max_objects];
- float occluded[max_objects];
- bool checkcollide(XYZ startpoint, XYZ endpoint,int which);
- bool onfire[max_objects];
- float flamedelay[max_objects];
+ XYZ center;
+ float radius;
+ XYZ position[max_objects];
+ int type[max_objects];
+ float yaw[max_objects];
+ float pitch[max_objects];
+ float rotx[max_objects];
+ float rotxvel[max_objects];
+ float roty[max_objects];
+ float rotyvel[max_objects];
+ int numobjects;
+ bool possible[max_objects];
+ Model model[max_objects];
+ Model displaymodel[max_objects];
+ float friction[max_objects];
+ float scale[max_objects];
+ float messedwith[max_objects];
+ float checked[max_objects];
+ Texture boxtextureptr;
+ Texture treetextureptr;
+ Texture bushtextureptr;
+ Texture rocktextureptr;
+ float shadowed[max_objects];
+ float occluded[max_objects];
+ bool checkcollide(XYZ startpoint, XYZ endpoint, int which);
+ bool onfire[max_objects];
+ float flamedelay[max_objects];
- void SphereCheckPossible(XYZ *p1,float radius);
- void DeleteObject(int which);
- void MakeObject(int atype, XYZ where, float ayaw, float ascale);
- void MakeObject(int atype, XYZ where, float ayaw, float apitch, float ascale);
- void Draw();
- void DoShadows();
- void DoStuff();
+ void SphereCheckPossible(XYZ *p1, float radius);
+ void DeleteObject(int which);
+ void MakeObject(int atype, XYZ where, float ayaw, float ascale);
+ void MakeObject(int atype, XYZ where, float ayaw, float apitch, float ascale);
+ void Draw();
+ void DoShadows();
+ void DoStuff();
- Objects();
- ~Objects();
+ Objects();
+ ~Objects();
};
#endif
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#include "Game.h"
extern "C" {
- #include "zlib.h"
- #include "png.h"
- #ifdef WIN32
- #define INT32 INT32_jpeg
- #include "jpeglib.h"
- #undef INT32
- #else
- #include "jpeglib.h"
- #endif
+#include "zlib.h"
+#include "png.h"
+#ifdef WIN32
+#define INT32 INT32_jpeg
+#include "jpeglib.h"
+#undef INT32
+#else
+#include "jpeglib.h"
+#endif
}
using namespace Game;
extern bool freeze;
extern bool stillloading;
extern int mainmenu;
-/*extern*/ bool gameFocused;
+/*extern*/
+bool gameFocused;
extern float slomospeed;
extern float slomofreq;
static bool lookup_glsym(const char *funcname, void **func)
{
*func = SDL_GL_GetProcAddress(funcname);
- if (*func == NULL)
- {
+ if (*func == NULL) {
fprintf(stderr, "Failed to find OpenGL symbol \"%s\"\n", funcname);
return false;
}
static bool lookup_all_glsyms(void)
{
bool retval = true;
- #define GL_FUNC(ret,fn,params,call,rt) \
+#define GL_FUNC(ret,fn,params,call,rt) \
if (!lookup_glsym(#fn, (void **) &p##fn)) retval = false;
- #include "glstubs.h"
- #undef GL_FUNC
+#include "glstubs.h"
+#undef GL_FUNC
return retval;
}
bool cmdline(const char *cmd)
{
- for (int i = 1; i < _argc; i++)
- {
+ for (int i = 1; i < _argc; i++) {
char *arg = _argv[i];
while (*arg == '-')
arg++;
// OpenGL Drawing
-void initGL(){
- glClear( GL_COLOR_BUFFER_BIT );
- swap_gl_buffers();
-
- // clear all states
- glDisable( GL_ALPHA_TEST);
- glDisable( GL_BLEND);
- glDisable( GL_DEPTH_TEST);
- // glDisable( GL_DITHER);
- glDisable( GL_FOG);
- glDisable( GL_LIGHTING);
- glDisable( GL_LOGIC_OP);
- glDisable( GL_TEXTURE_1D);
- glDisable( GL_TEXTURE_2D);
- glPixelTransferi( GL_MAP_COLOR, GL_FALSE);
- glPixelTransferi( GL_RED_SCALE, 1);
- glPixelTransferi( GL_RED_BIAS, 0);
- glPixelTransferi( GL_GREEN_SCALE, 1);
- glPixelTransferi( GL_GREEN_BIAS, 0);
- glPixelTransferi( GL_BLUE_SCALE, 1);
- glPixelTransferi( GL_BLUE_BIAS, 0);
- glPixelTransferi( GL_ALPHA_SCALE, 1);
- glPixelTransferi( GL_ALPHA_BIAS, 0);
-
- // set initial rendering states
- glShadeModel( GL_SMOOTH);
- glClearDepth( 1.0f);
- glDepthFunc( GL_LEQUAL);
- glDepthMask( GL_TRUE);
- // glDepthRange( FRONT_CLIP, BACK_CLIP);
- glEnable( GL_DEPTH_TEST);
- glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
- glCullFace( GL_FRONT);
- glEnable( GL_CULL_FACE);
- glEnable( GL_LIGHTING);
+void initGL()
+{
+ glClear( GL_COLOR_BUFFER_BIT );
+ swap_gl_buffers();
+
+ // clear all states
+ glDisable( GL_ALPHA_TEST);
+ glDisable( GL_BLEND);
+ glDisable( GL_DEPTH_TEST);
+ // glDisable( GL_DITHER);
+ glDisable( GL_FOG);
+ glDisable( GL_LIGHTING);
+ glDisable( GL_LOGIC_OP);
+ glDisable( GL_TEXTURE_1D);
+ glDisable( GL_TEXTURE_2D);
+ glPixelTransferi( GL_MAP_COLOR, GL_FALSE);
+ glPixelTransferi( GL_RED_SCALE, 1);
+ glPixelTransferi( GL_RED_BIAS, 0);
+ glPixelTransferi( GL_GREEN_SCALE, 1);
+ glPixelTransferi( GL_GREEN_BIAS, 0);
+ glPixelTransferi( GL_BLUE_SCALE, 1);
+ glPixelTransferi( GL_BLUE_BIAS, 0);
+ glPixelTransferi( GL_ALPHA_SCALE, 1);
+ glPixelTransferi( GL_ALPHA_BIAS, 0);
+
+ // set initial rendering states
+ glShadeModel( GL_SMOOTH);
+ glClearDepth( 1.0f);
+ glDepthFunc( GL_LEQUAL);
+ glDepthMask( GL_TRUE);
+ // glDepthRange( FRONT_CLIP, BACK_CLIP);
+ glEnable( GL_DEPTH_TEST);
+ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+ glCullFace( GL_FRONT);
+ glEnable( GL_CULL_FACE);
+ glEnable( GL_LIGHTING);
// glEnable( GL_LIGHT_MODEL_AMBIENT);
- glEnable( GL_DITHER);
- glEnable( GL_COLOR_MATERIAL);
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glAlphaFunc( GL_GREATER, 0.5f);
-
- if ( CanInitStereo(stereomode) ) {
- InitStereo(stereomode);
- } else {
- fprintf(stderr, "Failed to initialize stereo, disabling.\n");
- stereomode = stereoNone;
- }
+ glEnable( GL_DITHER);
+ glEnable( GL_COLOR_MATERIAL);
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glAlphaFunc( GL_GREATER, 0.5f);
+
+ if ( CanInitStereo(stereomode) ) {
+ InitStereo(stereomode);
+ } else {
+ fprintf(stderr, "Failed to initialize stereo, disabling.\n");
+ stereomode = stereoNone;
+ }
}
-static void toggleFullscreen(){
- if(!SDL_WM_ToggleFullScreen(SDL_GetVideoSurface())){
- SDL_Surface* screen=SDL_GetVideoSurface();
- Uint32 flags=screen->flags;
- screen=SDL_SetVideoMode(0,0,0,flags^SDL_FULLSCREEN);
- if(!screen)
- screen=SDL_SetVideoMode(0,0,0,flags);
- if(!screen)
+static void toggleFullscreen()
+{
+ if (!SDL_WM_ToggleFullScreen(SDL_GetVideoSurface())) {
+ SDL_Surface* screen = SDL_GetVideoSurface();
+ Uint32 flags = screen->flags;
+ screen = SDL_SetVideoMode(0, 0, 0, flags ^ SDL_FULLSCREEN);
+ if (!screen)
+ screen = SDL_SetVideoMode(0, 0, 0, flags);
+ if (!screen)
exit(1);
//reload opengl state
initGL();
Texture::reloadAll();
- if(text)
+ if (text)
text->BuildFont();
- if(firstload){
- screentexture=0;
+ if (firstload) {
+ screentexture = 0;
LoadScreenTexture();
}
- screentexture2=0;
+ screentexture2 = 0;
}
}
static void sdlEventProc(const SDL_Event &e)
{
- switch(e.type) {
- case SDL_MOUSEMOTION:
- deltah += e.motion.xrel;
- deltav += e.motion.yrel;
- break;
-
- case SDL_KEYDOWN:
- if ((e.key.keysym.sym == SDLK_g) &&
- (e.key.keysym.mod & KMOD_CTRL) &&
- !(SDL_GetVideoSurface()->flags & SDL_FULLSCREEN) ) {
- SDL_WM_GrabInput( ((SDL_WM_GrabInput(SDL_GRAB_QUERY)==SDL_GRAB_ON) ? SDL_GRAB_OFF:SDL_GRAB_ON) );
- } else if ( (e.key.keysym.sym == SDLK_RETURN) && (e.key.keysym.mod & KMOD_ALT) ) {
- toggleFullscreen();
- }
- break;
+ switch (e.type) {
+ case SDL_MOUSEMOTION:
+ deltah += e.motion.xrel;
+ deltav += e.motion.yrel;
+ break;
+
+ case SDL_KEYDOWN:
+ if ((e.key.keysym.sym == SDLK_g) &&
+ (e.key.keysym.mod & KMOD_CTRL) &&
+ !(SDL_GetVideoSurface()->flags & SDL_FULLSCREEN) ) {
+ SDL_WM_GrabInput( ((SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON) ? SDL_GRAB_OFF : SDL_GRAB_ON) );
+ } else if ( (e.key.keysym.sym == SDLK_RETURN) && (e.key.keysym.mod & KMOD_ALT) ) {
+ toggleFullscreen();
+ }
+ break;
}
}
Boolean SetUp ()
{
- char string[10];
+ char string[10];
+
+ LOGFUNC;
- LOGFUNC;
+ osx = 0;
+ cellophane = 0;
+ texdetail = 4;
+ slomospeed = 0.25;
+ slomofreq = 8012;
+ numplayers = 1;
- osx = 0;
- cellophane=0;
- texdetail=4;
- slomospeed=0.25;
- slomofreq=8012;
- numplayers=1;
-
- DefaultSettings();
+ DefaultSettings();
if (!SDL_WasInit(SDL_INIT_VIDEO))
- if (SDL_Init(SDL_INIT_VIDEO) == -1)
- {
+ if (SDL_Init(SDL_INIT_VIDEO) == -1) {
fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
return false;
}
- if(!LoadSettings()) {
- fprintf(stderr, "Failed to load config, creating default\n");
- SaveSettings();
- }
- if(kBitsPerPixel!=32&&kBitsPerPixel!=16){
- kBitsPerPixel=16;
- }
-
- if (SDL_GL_LoadLibrary(NULL) == -1)
- {
- fprintf(stderr, "SDL_GL_LoadLibrary() failed: %s\n", SDL_GetError());
- SDL_Quit();
- return false;
- }
-
- SDL_Rect **res = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_OPENGL);
- if ( (res == NULL) || (res == ((SDL_Rect **)-1)) || (res[0] == NULL) || (res[0]->w < 640) || (res[0]->h < 480) )
- res = hardcoded_resolutions;
-
- // reverse list (it was sorted biggest to smallest by SDL)...
- int count;
- for (count = 0; res[count]; count++)
- {
- if ((res[count]->w < 640) || (res[count]->h < 480))
- break; // sane lower limit.
- }
-
- static SDL_Rect *resolutions_block = NULL;
- resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count);
- resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1));
- if ((resolutions_block == NULL) || (resolutions == NULL))
- {
- SDL_Quit();
- fprintf(stderr, "Out of memory!\n");
- return false;
- }
-
- resolutions[count--] = NULL;
- for (int i = 0; count >= 0; i++, count--)
- {
- memcpy(&resolutions_block[count], res[i], sizeof (SDL_Rect));
- resolutions[count] = &resolutions_block[count];
- }
-
- if (cmdline("showresolutions"))
- {
- printf("Resolutions we think are okay:\n");
- for (int i = 0; resolutions[i]; i++)
- printf(" %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h);
- }
+ if (!LoadSettings()) {
+ fprintf(stderr, "Failed to load config, creating default\n");
+ SaveSettings();
+ }
+ if (kBitsPerPixel != 32 && kBitsPerPixel != 16) {
+ kBitsPerPixel = 16;
+ }
+
+ if (SDL_GL_LoadLibrary(NULL) == -1) {
+ fprintf(stderr, "SDL_GL_LoadLibrary() failed: %s\n", SDL_GetError());
+ SDL_Quit();
+ return false;
+ }
+
+ SDL_Rect **res = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_OPENGL);
+ if ( (res == NULL) || (res == ((SDL_Rect **) - 1)) || (res[0] == NULL) || (res[0]->w < 640) || (res[0]->h < 480) )
+ res = hardcoded_resolutions;
+
+ // reverse list (it was sorted biggest to smallest by SDL)...
+ int count;
+ for (count = 0; res[count]; count++) {
+ if ((res[count]->w < 640) || (res[count]->h < 480))
+ break; // sane lower limit.
+ }
+
+ static SDL_Rect *resolutions_block = NULL;
+ resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count);
+ resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1));
+ if ((resolutions_block == NULL) || (resolutions == NULL)) {
+ SDL_Quit();
+ fprintf(stderr, "Out of memory!\n");
+ return false;
+ }
+
+ resolutions[count--] = NULL;
+ for (int i = 0; count >= 0; i++, count--) {
+ memcpy(&resolutions_block[count], res[i], sizeof (SDL_Rect));
+ resolutions[count] = &resolutions_block[count];
+ }
+
+ if (cmdline("showresolutions")) {
+ printf("Resolutions we think are okay:\n");
+ for (int i = 0; resolutions[i]; i++)
+ printf(" %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h);
+ }
Uint32 sdlflags = SDL_OPENGL;
-
+
if (!cmdline("windowed"))
sdlflags |= SDL_FULLSCREEN;
#if SDL_VERSION_ATLEAST(1, 2, 10)
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vblsync);
#endif
-
- if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL)
- {
+
+ if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) {
fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
fprintf(stderr, "forcing 640x480...\n");
kContextWidth = 640;
kContextHeight = 480;
- if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL)
- {
+ if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) {
fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
fprintf(stderr, "forcing 640x480 windowed mode...\n");
sdlflags &= ~SDL_FULLSCREEN;
- if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL)
- {
+ if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) {
fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
return false;
}
}
int dblbuf = 0;
- if ((SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &dblbuf) == -1) || (!dblbuf))
- {
+ if ((SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &dblbuf) == -1) || (!dblbuf)) {
fprintf(stderr, "Failed to get double buffered GL context!\n");
SDL_Quit();
return false;
}
- if (!lookup_all_glsyms())
- {
+ if (!lookup_all_glsyms()) {
SDL_Quit();
return false;
}
initGL();
- GLint width = kContextWidth;
- GLint height = kContextHeight;
- gMidPoint.h = width / 2;
- gMidPoint.v = height / 2;
- screenwidth=width;
- screenheight=height;
+ GLint width = kContextWidth;
+ GLint height = kContextHeight;
+ gMidPoint.h = width / 2;
+ gMidPoint.v = height / 2;
+ screenwidth = width;
+ screenheight = height;
- newdetail=detail;
- newscreenwidth=screenwidth;
- newscreenheight=screenheight;
+ newdetail = detail;
+ newscreenwidth = screenwidth;
+ newscreenheight = screenheight;
- InitGame();
+ InitGame();
- return true;
+ return true;
}
static void DoMouse()
{
- if(mainmenu|| ( (abs(deltah)<10*realmultiplier*1000) && (abs(deltav)<10*realmultiplier*1000) ))
- {
- deltah *= usermousesensitivity;
- deltav *= usermousesensitivity;
- mousecoordh += deltah;
- mousecoordv += deltav;
+ if (mainmenu || ( (abs(deltah) < 10 * realmultiplier * 1000) && (abs(deltav) < 10 * realmultiplier * 1000) )) {
+ deltah *= usermousesensitivity;
+ deltav *= usermousesensitivity;
+ mousecoordh += deltah;
+ mousecoordv += deltav;
if (mousecoordh < 0)
mousecoordh = 0;
else if (mousecoordh >= kContextWidth)
mousecoordv = 0;
else if (mousecoordv >= kContextHeight)
mousecoordv = kContextHeight - 1;
- }
+ }
}
void DoFrameRate (int update)
-{
- static long frames = 0;
-
- static AbsoluteTime time = {0,0};
- static AbsoluteTime frametime = {0,0};
- AbsoluteTime currTime = UpTime ();
- double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime);
-
- if (0 > deltaTime) // if negative microseconds
- deltaTime /= -1000000.0;
- else // else milliseconds
- deltaTime /= 1000.0;
-
- multiplier=deltaTime;
- if(multiplier<.001) multiplier=.001;
- if(multiplier>10) multiplier=10;
- if(update) frametime = currTime; // reset for next time interval
-
- deltaTime = (float) AbsoluteDeltaToDuration (currTime, time);
-
- if (0 > deltaTime) // if negative microseconds
- deltaTime /= -1000000.0;
- else // else milliseconds
- deltaTime /= 1000.0;
- frames++;
- if (0.001 <= deltaTime) // has update interval passed
- {
- if(update){
- time = currTime; // reset for next time interval
- frames = 0;
- }
- }
+{
+ static long frames = 0;
+
+ static AbsoluteTime time = {0, 0};
+ static AbsoluteTime frametime = {0, 0};
+ AbsoluteTime currTime = UpTime ();
+ double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime);
+
+ if (0 > deltaTime) // if negative microseconds
+ deltaTime /= -1000000.0;
+ else // else milliseconds
+ deltaTime /= 1000.0;
+
+ multiplier = deltaTime;
+ if (multiplier < .001) multiplier = .001;
+ if (multiplier > 10) multiplier = 10;
+ if (update) frametime = currTime; // reset for next time interval
+
+ deltaTime = (float) AbsoluteDeltaToDuration (currTime, time);
+
+ if (0 > deltaTime) // if negative microseconds
+ deltaTime /= -1000000.0;
+ else // else milliseconds
+ deltaTime /= 1000.0;
+ frames++;
+ if (0.001 <= deltaTime) { // has update interval passed
+ if (update) {
+ time = currTime; // reset for next time interval
+ frames = 0;
+ }
+ }
}
void DoUpdate ()
{
- static float sps=200;
- static int count;
- static float oldmult;
-
- DoFrameRate(1);
- if(multiplier>.6)multiplier=.6;
-
- fps=1/multiplier;
-
- count = multiplier*sps;
- if(count<2)count=2;
-
- realmultiplier=multiplier;
- multiplier*=gamespeed;
- if(difficulty==1)multiplier*=.9;
- if(difficulty==0)multiplier*=.8;
-
- if(loading==4)multiplier*=.00001;
- if(slomo&&!mainmenu)multiplier*=slomospeed;
- oldmult=multiplier;
- multiplier/=(float)count;
-
- DoMouse();
-
- TickOnce();
-
- for(int i=0;i<count;i++)
- {
- Tick();
- }
- multiplier=oldmult;
-
- TickOnceAfter();
-/* - Debug code to test how many channels were active on average per frame
- static long frames = 0;
-
- static AbsoluteTime start = {0,0};
- AbsoluteTime currTime = UpTime ();
- static int num_channels = 0;
-
- num_channels += OPENAL_GetChannelsPlaying();
- double deltaTime = (float) AbsoluteDeltaToDuration (currTime, start);
-
- if (0 > deltaTime) // if negative microseconds
- deltaTime /= -1000000.0;
- else // else milliseconds
- deltaTime /= 1000.0;
-
- ++frames;
-
- if (deltaTime >= 1)
- {
- start = currTime;
- float avg_channels = (float)num_channels / (float)frames;
-
- ofstream opstream("log.txt",ios::app);
- opstream << "Average frame count: ";
- opstream << frames;
- opstream << " frames - ";
- opstream << avg_channels;
- opstream << " per frame.\n";
- opstream.close();
-
- frames = 0;
- num_channels = 0;
- }
-*/
- if ( stereomode == stereoNone ) {
- DrawGLScene(stereoCenter);
- } else {
- DrawGLScene(stereoLeft);
- DrawGLScene(stereoRight);
- }
+ static float sps = 200;
+ static int count;
+ static float oldmult;
+
+ DoFrameRate(1);
+ if (multiplier > .6)multiplier = .6;
+
+ fps = 1 / multiplier;
+
+ count = multiplier * sps;
+ if (count < 2)count = 2;
+
+ realmultiplier = multiplier;
+ multiplier *= gamespeed;
+ if (difficulty == 1)multiplier *= .9;
+ if (difficulty == 0)multiplier *= .8;
+
+ if (loading == 4)multiplier *= .00001;
+ if (slomo && !mainmenu)multiplier *= slomospeed;
+ oldmult = multiplier;
+ multiplier /= (float)count;
+
+ DoMouse();
+
+ TickOnce();
+
+ for (int i = 0; i < count; i++) {
+ Tick();
+ }
+ multiplier = oldmult;
+
+ TickOnceAfter();
+ /* - Debug code to test how many channels were active on average per frame
+ static long frames = 0;
+
+ static AbsoluteTime start = {0,0};
+ AbsoluteTime currTime = UpTime ();
+ static int num_channels = 0;
+
+ num_channels += OPENAL_GetChannelsPlaying();
+ double deltaTime = (float) AbsoluteDeltaToDuration (currTime, start);
+
+ if (0 > deltaTime) // if negative microseconds
+ deltaTime /= -1000000.0;
+ else // else milliseconds
+ deltaTime /= 1000.0;
+
+ ++frames;
+
+ if (deltaTime >= 1)
+ {
+ start = currTime;
+ float avg_channels = (float)num_channels / (float)frames;
+
+ ofstream opstream("log.txt",ios::app);
+ opstream << "Average frame count: ";
+ opstream << frames;
+ opstream << " frames - ";
+ opstream << avg_channels;
+ opstream << " per frame.\n";
+ opstream.close();
+
+ frames = 0;
+ num_channels = 0;
+ }
+ */
+ if ( stereomode == stereoNone ) {
+ DrawGLScene(stereoCenter);
+ } else {
+ DrawGLScene(stereoLeft);
+ DrawGLScene(stereoRight);
+ }
}
// --------------------------------------------------------------------------
void CleanUp (void)
{
- LOGFUNC;
+ LOGFUNC;
SDL_Quit();
- #define GL_FUNC(ret,fn,params,call,rt) p##fn = NULL;
- #include "glstubs.h"
- #undef GL_FUNC
+#define GL_FUNC(ret,fn,params,call,rt) p##fn = NULL;
+#include "glstubs.h"
+#undef GL_FUNC
// cheat here...static destructors are calling glDeleteTexture() after
// the context is destroyed and libGL unloaded by SDL_Quit().
pglDeleteTextures = glDeleteTextures_doNothing;
char *start = envr;
char *ptr;
- do
- {
+ do {
size_t size;
ptr = strchr(start, ':'); /* find next $PATH separator. */
if (ptr)
*ptr = '\0';
size = strlen(start) + strlen(bin) + 2;
- if (size > alloc_size)
- {
+ if (size > alloc_size) {
char *x = (char *) realloc(exe, size);
- if (x == NULL)
- {
+ if (x == NULL) {
if (exe != NULL)
free(exe);
return(NULL);
strcat(exe, "/");
strcat(exe, bin);
- if (access(exe, X_OK) == 0) /* Exists as executable? We're done. */
- {
+ if (access(exe, X_OK) == 0) { /* Exists as executable? We're done. */
strcpy(exe, start); /* i'm lazy. piss off. */
return(exe);
} /* if */
char *envr;
const char *ptr = strrchr((char *)argv0, '/');
- if (strchr(argv0, '/'))
- {
+ if (strchr(argv0, '/')) {
retval = strdup(argv0);
if (retval)
*((char *) strrchr(retval, '/')) = '\0';
static inline void chdirToAppPath(const char *argv0)
{
char *dir = calcBaseDir(argv0);
- if (dir)
- {
- #if (defined(__APPLE__) && defined(__MACH__))
+ if (dir) {
+#if (defined(__APPLE__) && defined(__MACH__))
// Chop off /Contents/MacOS if it's at the end of the string, so we
// land in the base of the app bundle.
const size_t len = strlen(dir);
const char *bundledirs = "/Contents/MacOS";
const size_t bundledirslen = strlen(bundledirs);
- if (len > bundledirslen)
- {
+ if (len > bundledirslen) {
char *ptr = (dir + len) - bundledirslen;
if (strcasecmp(ptr, bundledirs) == 0)
*ptr = '\0';
}
- #endif
+#endif
chdir(dir);
free(dir);
}
chdirToAppPath(argv[0]);
#endif
- LOGFUNC;
+ LOGFUNC;
- try
- {
- {
- newGame();
+ try {
+ {
+ newGame();
- //ofstream os("error.txt");
- //os.close();
- //ofstream os("log.txt");
- //os.close();
+ //ofstream os("error.txt");
+ //os.close();
+ //ofstream os("log.txt");
+ //os.close();
- if (!SetUp ())
+ if (!SetUp ())
return 42;
- while (!gDone&&!tryquit)
- {
- if (IsFocused())
- {
- gameFocused = true;
-
- // check windows messages
-
- deltah = 0;
- deltav = 0;
- SDL_Event e;
- if(!waiting) {
- // message pump
- while( SDL_PollEvent( &e ) )
- {
- if( e.type == SDL_QUIT )
- {
- gDone=true;
- break;
- }
- sdlEventProc(e);
- }
- }
-
- // game
- DoUpdate();
- }
- else
- {
- if (gameFocused)
- {
- // allow game chance to pause
- gameFocused = false;
- DoUpdate();
- }
-
- // game is not in focus, give CPU time to other apps by waiting for messages instead of 'peeking'
- SDL_ActiveEvent evt;
- SDL_WaitEvent((SDL_Event*)&evt);
- if (evt.type == SDL_ACTIVEEVENT && evt.gain == 1)
- gameFocused = true;
- else if (evt.type == SDL_QUIT)
- gDone = true;
- }
- }
+ while (!gDone && !tryquit) {
+ if (IsFocused()) {
+ gameFocused = true;
+
+ // check windows messages
+
+ deltah = 0;
+ deltav = 0;
+ SDL_Event e;
+ if (!waiting) {
+ // message pump
+ while ( SDL_PollEvent( &e ) ) {
+ if ( e.type == SDL_QUIT ) {
+ gDone = true;
+ break;
+ }
+ sdlEventProc(e);
+ }
+ }
+
+ // game
+ DoUpdate();
+ } else {
+ if (gameFocused) {
+ // allow game chance to pause
+ gameFocused = false;
+ DoUpdate();
+ }
+
+ // game is not in focus, give CPU time to other apps by waiting for messages instead of 'peeking'
+ SDL_ActiveEvent evt;
+ SDL_WaitEvent((SDL_Event*)&evt);
+ if (evt.type == SDL_ACTIVEEVENT && evt.gain == 1)
+ gameFocused = true;
+ else if (evt.type == SDL_QUIT)
+ gDone = true;
+ }
+ }
deleteGame();
- }
+ }
- CleanUp ();
+ CleanUp ();
- return 0;
- }
- catch (const std::exception& error)
- {
- CleanUp();
+ return 0;
+ } catch (const std::exception& error) {
+ CleanUp();
- std::string e = "Caught exception: ";
- e += error.what();
+ std::string e = "Caught exception: ";
+ e += error.what();
- LOG(e);
+ LOG(e);
- MessageBox(g_windowHandle, error.what(), "ERROR", MB_OK | MB_ICONEXCLAMATION);
- }
+ MessageBox(g_windowHandle, error.what(), "ERROR", MB_OK | MB_ICONEXCLAMATION);
+ }
- CleanUp();
+ CleanUp();
- return -1;
+ return -1;
}
bool LoadImage(const char * fname, TGAImageRec & tex)
{
- if ( tex.data == NULL )
- return false;
- else
- return load_image(fname, tex);
+ if ( tex.data == NULL )
+ return false;
+ else
+ return load_image(fname, tex);
}
void ScreenShot(const char * fname)
{
-
+
}
static bool load_image(const char *file_name, TGAImageRec &tex)
{
const char *ptr = strrchr((char *)file_name, '.');
- if (ptr)
- {
- if (strcasecmp(ptr+1, "png") == 0)
+ if (ptr) {
+ if (strcasecmp(ptr + 1, "png") == 0)
return load_png(file_name, tex);
- else if (strcasecmp(ptr+1, "jpg") == 0)
+ else if (strcasecmp(ptr + 1, "jpg") == 0)
return load_jpg(file_name, tex);
}
struct my_error_mgr {
- struct jpeg_error_mgr pub; /* "public" fields */
- jmp_buf setjmp_buffer; /* for return to caller */
+ struct jpeg_error_mgr pub; /* "public" fields */
+ jmp_buf setjmp_buffer; /* for return to caller */
};
typedef struct my_error_mgr * my_error_ptr;
static void my_error_exit(j_common_ptr cinfo)
{
- struct my_error_mgr *err = (struct my_error_mgr *)cinfo->err;
- longjmp(err->setjmp_buffer, 1);
+ struct my_error_mgr *err = (struct my_error_mgr *)cinfo->err;
+ longjmp(err->setjmp_buffer, 1);
}
/* stolen from public domain example.c code in libjpg distribution. */
while (cinfo.output_scanline < cinfo.output_height) {
buffer[0] = (JSAMPROW)(char *)tex.data +
- ((cinfo.output_height-1) - cinfo.output_scanline) * row_stride;
+ ((cinfo.output_height - 1) - cinfo.output_scanline) * row_stride;
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
}
FILE *fp = fopen(file_name, "rb");
if (fp == NULL) {
- cerr << file_name << " not found" << endl;
+ cerr << file_name << " not found" << endl;
return(NULL);
- }
+ }
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL)
if (!row_pointers)
goto png_done;
- if (!hasalpha)
- {
+ if (!hasalpha) {
png_byte *dst = tex.data;
- for (int i = height-1; i >= 0; i--)
- {
+ for (int i = height - 1; i >= 0; i--) {
png_byte *src = row_pointers[i];
- for (int j = 0; j < width; j++)
- {
+ for (int j = 0; j < width; j++) {
dst[0] = src[0];
dst[1] = src[1];
dst[2] = src[2];
}
}
- else
- {
+ else {
png_byte *dst = tex.data;
int pitch = width * 4;
- for (int i = height-1; i >= 0; i--, dst += pitch)
+ for (int i = height - 1; i >= 0; i--, dst += pitch)
memcpy(dst, row_pointers[i], pitch);
}
tex.sizeY = height;
tex.bpp = 32;
retval = true;
-
+
png_done:
- if(!retval) {
- cerr << "There was a problem loading " << file_name << endl;
- }
+ if (!retval) {
+ cerr << "There was a problem loading " << file_name << endl;
+ }
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
if (fp)
fclose(fp);
bool save_image(const char *file_name)
{
const char *ptr = strrchr((char *)file_name, '.');
- if (ptr)
- {
- if (strcasecmp(ptr+1, "png") == 0)
+ if (ptr) {
+ if (strcasecmp(ptr + 1, "png") == 0)
return save_png(file_name);
}
goto save_png_done;
for (int i = 0; i < kContextHeight; i++)
- row_pointers[i] = screenshot + ((kContextWidth * ((kContextHeight-1) - i)) * 3);
+ row_pointers[i] = screenshot + ((kContextWidth * ((kContextHeight - 1) - i)) * 3);
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL)
if (setjmp(png_jmpbuf(png_ptr)))
goto save_png_done;
- png_write_image(png_ptr, row_pointers);
+ png_write_image(png_ptr, row_pointers);
- if (setjmp(png_jmpbuf(png_ptr)))
+ if (setjmp(png_jmpbuf(png_ptr)))
goto save_png_done;
png_write_end(png_ptr, NULL);
/* convenience functions
*/
-Joint& Person::joint(int bodypart) { return skeleton.joints[skeleton.jointlabels[bodypart]]; }
-XYZ& Person::jointPos(int bodypart) { return joint(bodypart).position; }
-XYZ& Person::jointVel(int bodypart) { return joint(bodypart).velocity; }
+Joint& Person::joint(int bodypart)
+{
+ return skeleton.joints[skeleton.jointlabels[bodypart]];
+}
+XYZ& Person::jointPos(int bodypart)
+{
+ return joint(bodypart).position;
+}
+XYZ& Person::jointVel(int bodypart)
+{
+ return joint(bodypart).velocity;
+}
/* EFFECT
*
if (creature == rabbittype)
for (i = 0; i < 512; i++) {
for (j = 0; j < 512; j++) {
- if (bloodText[i*512*3 + j*3 + 0] <= which + 4 && bloodText[i*512*3 + j*3 + 0] >= which - 4) {
+ if (bloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && bloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) {
if (i < startx) startx = i;
if (j < starty) starty = j;
if (i > endx) endx = i;
if (creature == wolftype)
for (i = 0; i < 512; i++) {
for (j = 0; j < 512; j++) {
- if (wolfbloodText[i*512*3 + j*3 + 0] <= which + 4 && wolfbloodText[i*512*3 + j*3 + 0] >= which - 4) {
+ if (wolfbloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && wolfbloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) {
if (i < startx) startx = i;
if (j < starty) starty = j;
if (i > endx) endx = i;
/* EFFECT
* inverse kinematics helper function
*/
-void IKHelper(Person *p, float interp){
+void IKHelper(Person *p, float interp)
+{
XYZ point, newpoint, change, change2;
float heightleft, heightright;
if (!isSleeping() && !isSitting()) {
// TODO: give these meaningful names
const bool cond1 = (isIdle() || isCrouch() || isLanding() || isLandhard()
- || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim);
+ || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim);
const bool cond2 = (wasIdle() || wasCrouch() || wasLanding() || wasLandhard()
- || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim);
+ || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim);
if (onterrain && (cond1 && cond2) && !skeleton.free) {
IKHelper(this, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
if (p1 == abdomen || p2 == abdomen)
- glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionbody.x,
- (v0.y * (1-morphness) + v1.y * morphness) * proportionbody.y,
- (v0.z * (1-morphness) + v1.z * morphness) * proportionbody.z);
+ glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionbody.x,
+ (v0.y * (1 - morphness) + v1.y * morphness) * proportionbody.y,
+ (v0.z * (1 - morphness) + v1.z * morphness) * proportionbody.z);
if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow)
- glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionarms.x,
- (v0.y * (1-morphness) + v1.y * morphness) * proportionarms.y,
- (v0.z * (1-morphness) + v1.z * morphness) * proportionarms.z);
+ glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionarms.x,
+ (v0.y * (1 - morphness) + v1.y * morphness) * proportionarms.y,
+ (v0.z * (1 - morphness) + v1.z * morphness) * proportionarms.z);
if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee)
- glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionlegs.x,
- (v0.y * (1-morphness) + v1.y * morphness) * proportionlegs.y,
- (v0.z * (1-morphness) + v1.z * morphness) * proportionlegs.z);
+ glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionlegs.x,
+ (v0.y * (1 - morphness) + v1.y * morphness) * proportionlegs.y,
+ (v0.z * (1 - morphness) + v1.z * morphness) * proportionlegs.z);
if (p1 == head || p2 == head)
- glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionhead.x,
- (v0.y * (1-morphness) + v1.y * morphness) * proportionhead.y,
- (v0.z * (1-morphness) + v1.z * morphness) * proportionhead.z);
+ glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionhead.x,
+ (v0.y * (1 - morphness) + v1.y * morphness) * proportionhead.y,
+ (v0.z * (1 - morphness) + v1.z * morphness) * proportionhead.z);
glGetFloatv(GL_MODELVIEW_MATRIX, M);
//if(!isnormal(M[12])||!isnormal(M[13])||!isnormal(M[14]))test=0;
//if(!isnormal(scale))test=1;
intersecting = 1;
if (!intersecting)
intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
- &model->vertex[model->Triangles[j].vertex[1]],
- p1, &radius);
+ &model->vertex[model->Triangles[j].vertex[1]],
+ p1, &radius);
if (!intersecting)
intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[1]],
- &model->vertex[model->Triangles[j].vertex[2]],
- p1, &radius);
+ &model->vertex[model->Triangles[j].vertex[2]],
+ p1, &radius);
if (!intersecting)
intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
- &model->vertex[model->Triangles[j].vertex[2]],
- p1, &radius);
+ &model->vertex[model->Triangles[j].vertex[2]],
+ p1, &radius);
end = *p1 - point;
if (dotproduct(&model->facenormals[j], &end) > 0 && intersecting) {
start = *p1;
XYZ &v1 = model->vertex[model->Triangles[j].vertex[1]];
XYZ &v2 = model->vertex[model->Triangles[j].vertex[2]];
distance = abs((model->facenormals[j].x * start.x)
- + (model->facenormals[j].y * start.y)
- + (model->facenormals[j].z * start.z)
- - ((model->facenormals[j].x * v0.x)
- + (model->facenormals[j].y * v0.y)
- + (model->facenormals[j].z * v0.z)));
+ + (model->facenormals[j].y * start.y)
+ + (model->facenormals[j].z * start.z)
+ - ((model->facenormals[j].x * v0.x)
+ + (model->facenormals[j].y * v0.y)
+ + (model->facenormals[j].z * v0.z)));
if (distance < radius * .5) {
point = start - model->facenormals[j] * distance;
if (PointInTriangle( &point, model->facenormals[j], &v0, &v1, &v2))
intersecting = 1;
if (!intersecting)
- intersecting = sphere_line_intersection(v0.x,v0.y,v0.z, v1.x,v1.y,v1.z, p1->x, p1->y, p1->z, radius / 2);
+ intersecting = sphere_line_intersection(v0.x, v0.y, v0.z, v1.x, v1.y, v1.z, p1->x, p1->y, p1->z, radius / 2);
if (!intersecting)
- intersecting = sphere_line_intersection(v1.x,v1.y,v1.z, v2.x,v2.y,v2.z, p1->x, p1->y, p1->z, radius / 2);
+ intersecting = sphere_line_intersection(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, p1->x, p1->y, p1->z, radius / 2);
if (!intersecting)
- intersecting = sphere_line_intersection(v0.x,v0.y,v0.z, v2.x,v2.y,v2.z, p1->x, p1->y, p1->z, radius / 2);
+ intersecting = sphere_line_intersection(v0.x, v0.y, v0.z, v2.x, v2.y, v2.z, p1->x, p1->y, p1->z, radius / 2);
end = *p1 - point;
if (dotproduct(&model->facenormals[j], &end) > 0 && intersecting) {
if ((animTarget == jumpdownanim || animTarget == jumpupanim || isFlip())) {
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
float const pi = 3.14159265f;
float const g = -32.174f; // acceleration due to gravity, ft/s^2
float const rho = 0.0023769f; // desity of air at sea level, slugs/ft^3
-float const tol = 0.0000000001f; // float type tolerance
+float const tol = 0.0000000001f; // float type tolerance
//------------------------------------------------------------------------//
inline float DegreesToRadians(float deg)
{
- return deg * pi / 180.0f;
+ return deg * pi / 180.0f;
}
inline float RadiansToDegrees(float rad)
-{
- return rad * 180.0f / pi;
+{
+ return rad * 180.0f / pi;
}
//------------------------------------------------------------------------//
// Vector Class and vector functions
//------------------------------------------------------------------------//
-class Vector {
+class Vector
+{
public:
- float x;
- float y;
- float z;
+ float x;
+ float y;
+ float z;
- Vector(void);
- Vector(float xi, float yi, float zi);
+ Vector(void);
+ Vector(float xi, float yi, float zi);
- float Magnitude(void);
- void Normalize(void);
- void Reverse(void);
+ float Magnitude(void);
+ void Normalize(void);
+ void Reverse(void);
- Vector& operator+=(Vector u); // vector addition
- Vector& operator-=(Vector u); // vector subtraction
- Vector& operator*=(float s); // scalar multiply
- Vector& operator/=(float s); // scalar divide
+ Vector& operator+=(Vector u); // vector addition
+ Vector& operator-=(Vector u); // vector subtraction
+ Vector& operator*=(float s); // scalar multiply
+ Vector& operator/=(float s); // scalar divide
- Vector operator-(void);
+ Vector operator-(void);
};
/*
float fast_sqrt2 (register float arg);
float fast_sqrt2 (register float arg)
-{
+{
// Can replace with slower return std::sqrt(arg);
register float result;
asm {
frsqrte result,arg // Calculate Square root
-}
+}
// Newton Rhapson iterations.
result = result + 0.5 * result * (1.0 - arg * result * result);
*/
inline Vector::Vector(void)
{
- x = 0;
- y = 0;
- z = 0;
+ x = 0;
+ y = 0;
+ z = 0;
}
inline Vector::Vector(float xi, float yi, float zi)
{
- x = xi;
- y = yi;
- z = zi;
+ x = xi;
+ y = yi;
+ z = zi;
}
inline float Vector::Magnitude(void)
{
- return (float) sqrt(x*x + y*y + z*z);
+ return (float) sqrt(x * x + y * y + z * z);
}
inline void Vector::Normalize(void)
{
- float m = (float) sqrt(x*x + y*y + z*z);
- if(m <= tol) m = 1;
- x /= m;
- y /= m;
- z /= m;
+ float m = (float) sqrt(x * x + y * y + z * z);
+ if (m <= tol) m = 1;
+ x /= m;
+ y /= m;
+ z /= m;
- if (fabs(x) < tol) x = 0.0f;
- if (fabs(y) < tol) y = 0.0f;
- if (fabs(z) < tol) z = 0.0f;
+ if (fabs(x) < tol) x = 0.0f;
+ if (fabs(y) < tol) y = 0.0f;
+ if (fabs(z) < tol) z = 0.0f;
}
inline void Vector::Reverse(void)
{
- x = -x;
- y = -y;
- z = -z;
+ x = -x;
+ y = -y;
+ z = -z;
}
inline Vector& Vector::operator+=(Vector u)
{
- x += u.x;
- y += u.y;
- z += u.z;
- return *this;
+ x += u.x;
+ y += u.y;
+ z += u.z;
+ return *this;
}
inline Vector& Vector::operator-=(Vector u)
{
- x -= u.x;
- y -= u.y;
- z -= u.z;
- return *this;
+ x -= u.x;
+ y -= u.y;
+ z -= u.z;
+ return *this;
}
inline Vector& Vector::operator*=(float s)
{
- x *= s;
- y *= s;
- z *= s;
- return *this;
+ x *= s;
+ y *= s;
+ z *= s;
+ return *this;
}
inline Vector& Vector::operator/=(float s)
{
- x /= s;
- y /= s;
- z /= s;
- return *this;
+ x /= s;
+ y /= s;
+ z /= s;
+ return *this;
}
inline Vector Vector::operator-(void)
{
- return Vector(-x, -y, -z);
+ return Vector(-x, -y, -z);
}
inline Vector operator+(Vector u, Vector v)
{
- return Vector(u.x + v.x, u.y + v.y, u.z + v.z);
+ return Vector(u.x + v.x, u.y + v.y, u.z + v.z);
}
inline Vector operator-(Vector u, Vector v)
{
- return Vector(u.x - v.x, u.y - v.y, u.z - v.z);
+ return Vector(u.x - v.x, u.y - v.y, u.z - v.z);
}
// Vector cross product (u cross v)
inline Vector operator^(Vector u, Vector v)
{
- return Vector( u.y*v.z - u.z*v.y,
- -u.x*v.z + u.z*v.x,
- u.x*v.y - u.y*v.x );
+ return Vector( u.y * v.z - u.z * v.y,
+ -u.x * v.z + u.z * v.x,
+ u.x * v.y - u.y * v.x );
}
// Vector dot product
inline float operator*(Vector u, Vector v)
{
- return (u.x*v.x + u.y*v.y + u.z*v.z);
+ return (u.x * v.x + u.y * v.y + u.z * v.z);
}
inline Vector operator*(float s, Vector u)
{
- return Vector(u.x*s, u.y*s, u.z*s);
+ return Vector(u.x * s, u.y * s, u.z * s);
}
inline Vector operator*(Vector u, float s)
{
- return Vector(u.x*s, u.y*s, u.z*s);
+ return Vector(u.x * s, u.y * s, u.z * s);
}
inline Vector operator/(Vector u, float s)
{
- return Vector(u.x/s, u.y/s, u.z/s);
+ return Vector(u.x / s, u.y / s, u.z / s);
}
// triple scalar product (u dot (v cross w))
inline float TripleScalarProduct(Vector u, Vector v, Vector w)
{
- return float( (u.x * (v.y*w.z - v.z*w.y)) +
- (u.y * (-v.x*w.z + v.z*w.x)) +
- (u.z * (v.x*w.y - v.y*w.x)) );
- //return u*(v^w);
+ return float( (u.x * (v.y * w.z - v.z * w.y)) +
+ (u.y * (-v.x * w.z + v.z * w.x)) +
+ (u.z * (v.x * w.y - v.y * w.x)) );
+ //return u*(v^w);
}
// Matrix Class and matrix functions
//------------------------------------------------------------------------//
-class Matrix3x3 {
+class Matrix3x3
+{
public:
- // elements eij: i -> row, j -> column
- float e11, e12, e13, e21, e22, e23, e31, e32, e33;
-
- Matrix3x3(void);
- Matrix3x3( float r1c1, float r1c2, float r1c3,
- float r2c1, float r2c2, float r2c3,
- float r3c1, float r3c2, float r3c3 );
-
- float det(void);
- Matrix3x3 Transpose(void);
- Matrix3x3 Inverse(void);
-
- Matrix3x3& operator+=(Matrix3x3 m);
- Matrix3x3& operator-=(Matrix3x3 m);
- Matrix3x3& operator*=(float s);
- Matrix3x3& operator/=(float s);
+ // elements eij: i -> row, j -> column
+ float e11, e12, e13, e21, e22, e23, e31, e32, e33;
+
+ Matrix3x3(void);
+ Matrix3x3( float r1c1, float r1c2, float r1c3,
+ float r2c1, float r2c2, float r2c3,
+ float r3c1, float r3c2, float r3c3 );
+
+ float det(void);
+ Matrix3x3 Transpose(void);
+ Matrix3x3 Inverse(void);
+
+ Matrix3x3& operator+=(Matrix3x3 m);
+ Matrix3x3& operator-=(Matrix3x3 m);
+ Matrix3x3& operator*=(float s);
+ Matrix3x3& operator/=(float s);
};
inline Matrix3x3 operator+(Matrix3x3 m1, Matrix3x3 m2);
inline Matrix3x3::Matrix3x3(void)
{
- e11 = 0;
- e12 = 0;
- e13 = 0;
- e21 = 0;
- e22 = 0;
- e23 = 0;
- e31 = 0;
- e32 = 0;
- e33 = 0;
+ e11 = 0;
+ e12 = 0;
+ e13 = 0;
+ e21 = 0;
+ e22 = 0;
+ e23 = 0;
+ e31 = 0;
+ e32 = 0;
+ e33 = 0;
}
-inline Matrix3x3::Matrix3x3( float r1c1, float r1c2, float r1c3,
- float r2c1, float r2c2, float r2c3,
- float r3c1, float r3c2, float r3c3 )
+inline Matrix3x3::Matrix3x3( float r1c1, float r1c2, float r1c3,
+ float r2c1, float r2c2, float r2c3,
+ float r3c1, float r3c2, float r3c3 )
{
- e11 = r1c1;
- e12 = r1c2;
- e13 = r1c3;
- e21 = r2c1;
- e22 = r2c2;
- e23 = r2c3;
- e31 = r3c1;
- e32 = r3c2;
- e33 = r3c3;
+ e11 = r1c1;
+ e12 = r1c2;
+ e13 = r1c3;
+ e21 = r2c1;
+ e22 = r2c2;
+ e23 = r2c3;
+ e31 = r3c1;
+ e32 = r3c2;
+ e33 = r3c3;
}
inline float Matrix3x3::det(void)
{
- return e11*e22*e33 -
- e11*e32*e23 +
- e21*e32*e13 -
- e21*e12*e33 +
- e31*e12*e23 -
- e31*e22*e13;
+ return e11 * e22 * e33 -
+ e11 * e32 * e23 +
+ e21 * e32 * e13 -
+ e21 * e12 * e33 +
+ e31 * e12 * e23 -
+ e31 * e22 * e13;
}
inline Matrix3x3 Matrix3x3::Transpose(void)
{
- return Matrix3x3(e11,e21,e31,e12,e22,e32,e13,e23,e33);
+ return Matrix3x3(e11, e21, e31, e12, e22, e32, e13, e23, e33);
}
inline Matrix3x3 Matrix3x3::Inverse(void)
{
- float d = e11*e22*e33 -
- e11*e32*e23 +
- e21*e32*e13 -
- e21*e12*e33 +
- e31*e12*e23 -
- e31*e22*e13;
+ float d = e11 * e22 * e33 -
+ e11 * e32 * e23 +
+ e21 * e32 * e13 -
+ e21 * e12 * e33 +
+ e31 * e12 * e23 -
+ e31 * e22 * e13;
- if (d == 0) d = 1;
+ if (d == 0) d = 1;
- return Matrix3x3( (e22*e33-e23*e32)/d,
- -(e12*e33-e13*e32)/d,
- (e12*e23-e13*e22)/d,
- -(e21*e33-e23*e31)/d,
- (e11*e33-e13*e31)/d,
- -(e11*e23-e13*e21)/d,
- (e21*e32-e22*e31)/d,
- -(e11*e32-e12*e31)/d,
- (e11*e22-e12*e21)/d );
+ return Matrix3x3( (e22 * e33 - e23 * e32) / d,
+ -(e12 * e33 - e13 * e32) / d,
+ (e12 * e23 - e13 * e22) / d,
+ -(e21 * e33 - e23 * e31) / d,
+ (e11 * e33 - e13 * e31) / d,
+ -(e11 * e23 - e13 * e21) / d,
+ (e21 * e32 - e22 * e31) / d,
+ -(e11 * e32 - e12 * e31) / d,
+ (e11 * e22 - e12 * e21) / d );
}
inline Matrix3x3& Matrix3x3::operator+=(Matrix3x3 m)
{
- e11 += m.e11;
- e12 += m.e12;
- e13 += m.e13;
- e21 += m.e21;
- e22 += m.e22;
- e23 += m.e23;
- e31 += m.e31;
- e32 += m.e32;
- e33 += m.e33;
- return *this;
+ e11 += m.e11;
+ e12 += m.e12;
+ e13 += m.e13;
+ e21 += m.e21;
+ e22 += m.e22;
+ e23 += m.e23;
+ e31 += m.e31;
+ e32 += m.e32;
+ e33 += m.e33;
+ return *this;
}
inline Matrix3x3& Matrix3x3::operator-=(Matrix3x3 m)
{
- e11 -= m.e11;
- e12 -= m.e12;
- e13 -= m.e13;
- e21 -= m.e21;
- e22 -= m.e22;
- e23 -= m.e23;
- e31 -= m.e31;
- e32 -= m.e32;
- e33 -= m.e33;
- return *this;
+ e11 -= m.e11;
+ e12 -= m.e12;
+ e13 -= m.e13;
+ e21 -= m.e21;
+ e22 -= m.e22;
+ e23 -= m.e23;
+ e31 -= m.e31;
+ e32 -= m.e32;
+ e33 -= m.e33;
+ return *this;
}
inline Matrix3x3& Matrix3x3::operator*=(float s)
{
- e11 *= s;
- e12 *= s;
- e13 *= s;
- e21 *= s;
- e22 *= s;
- e23 *= s;
- e31 *= s;
- e32 *= s;
- e33 *= s;
- return *this;
+ e11 *= s;
+ e12 *= s;
+ e13 *= s;
+ e21 *= s;
+ e22 *= s;
+ e23 *= s;
+ e31 *= s;
+ e32 *= s;
+ e33 *= s;
+ return *this;
}
inline Matrix3x3& Matrix3x3::operator/=(float s)
{
- e11 /= s;
- e12 /= s;
- e13 /= s;
- e21 /= s;
- e22 /= s;
- e23 /= s;
- e31 /= s;
- e32 /= s;
- e33 /= s;
- return *this;
+ e11 /= s;
+ e12 /= s;
+ e13 /= s;
+ e21 /= s;
+ e22 /= s;
+ e23 /= s;
+ e31 /= s;
+ e32 /= s;
+ e33 /= s;
+ return *this;
}
inline Matrix3x3 operator+(Matrix3x3 m1, Matrix3x3 m2)
{
- return Matrix3x3( m1.e11+m2.e11,
- m1.e12+m2.e12,
- m1.e13+m2.e13,
- m1.e21+m2.e21,
- m1.e22+m2.e22,
- m1.e23+m2.e23,
- m1.e31+m2.e31,
- m1.e32+m2.e32,
- m1.e33+m2.e33);
+ return Matrix3x3( m1.e11 + m2.e11,
+ m1.e12 + m2.e12,
+ m1.e13 + m2.e13,
+ m1.e21 + m2.e21,
+ m1.e22 + m2.e22,
+ m1.e23 + m2.e23,
+ m1.e31 + m2.e31,
+ m1.e32 + m2.e32,
+ m1.e33 + m2.e33);
}
inline Matrix3x3 operator-(Matrix3x3 m1, Matrix3x3 m2)
{
- return Matrix3x3( m1.e11-m2.e11,
- m1.e12-m2.e12,
- m1.e13-m2.e13,
- m1.e21-m2.e21,
- m1.e22-m2.e22,
- m1.e23-m2.e23,
- m1.e31-m2.e31,
- m1.e32-m2.e32,
- m1.e33-m2.e33);
+ return Matrix3x3( m1.e11 - m2.e11,
+ m1.e12 - m2.e12,
+ m1.e13 - m2.e13,
+ m1.e21 - m2.e21,
+ m1.e22 - m2.e22,
+ m1.e23 - m2.e23,
+ m1.e31 - m2.e31,
+ m1.e32 - m2.e32,
+ m1.e33 - m2.e33);
}
inline Matrix3x3 operator/(Matrix3x3 m, float s)
-{
- return Matrix3x3( m.e11/s,
- m.e12/s,
- m.e13/s,
- m.e21/s,
- m.e22/s,
- m.e23/s,
- m.e31/s,
- m.e32/s,
- m.e33/s);
+{
+ return Matrix3x3( m.e11 / s,
+ m.e12 / s,
+ m.e13 / s,
+ m.e21 / s,
+ m.e22 / s,
+ m.e23 / s,
+ m.e31 / s,
+ m.e32 / s,
+ m.e33 / s);
}
inline Matrix3x3 operator*(Matrix3x3 m1, Matrix3x3 m2)
{
- return Matrix3x3( m1.e11*m2.e11 + m1.e12*m2.e21 + m1.e13*m2.e31,
- m1.e11*m2.e12 + m1.e12*m2.e22 + m1.e13*m2.e32,
- m1.e11*m2.e13 + m1.e12*m2.e23 + m1.e13*m2.e33,
- m1.e21*m2.e11 + m1.e22*m2.e21 + m1.e23*m2.e31,
- m1.e21*m2.e12 + m1.e22*m2.e22 + m1.e23*m2.e32,
- m1.e21*m2.e13 + m1.e22*m2.e23 + m1.e23*m2.e33,
- m1.e31*m2.e11 + m1.e32*m2.e21 + m1.e33*m2.e31,
- m1.e31*m2.e12 + m1.e32*m2.e22 + m1.e33*m2.e32,
- m1.e31*m2.e13 + m1.e32*m2.e23 + m1.e33*m2.e33 );
+ return Matrix3x3( m1.e11 * m2.e11 + m1.e12 * m2.e21 + m1.e13 * m2.e31,
+ m1.e11 * m2.e12 + m1.e12 * m2.e22 + m1.e13 * m2.e32,
+ m1.e11 * m2.e13 + m1.e12 * m2.e23 + m1.e13 * m2.e33,
+ m1.e21 * m2.e11 + m1.e22 * m2.e21 + m1.e23 * m2.e31,
+ m1.e21 * m2.e12 + m1.e22 * m2.e22 + m1.e23 * m2.e32,
+ m1.e21 * m2.e13 + m1.e22 * m2.e23 + m1.e23 * m2.e33,
+ m1.e31 * m2.e11 + m1.e32 * m2.e21 + m1.e33 * m2.e31,
+ m1.e31 * m2.e12 + m1.e32 * m2.e22 + m1.e33 * m2.e32,
+ m1.e31 * m2.e13 + m1.e32 * m2.e23 + m1.e33 * m2.e33 );
}
inline Matrix3x3 operator*(Matrix3x3 m, float s)
{
- return Matrix3x3( m.e11*s,
- m.e12*s,
- m.e13*s,
- m.e21*s,
- m.e22*s,
- m.e23*s,
- m.e31*s,
- m.e32*s,
- m.e33*s);
+ return Matrix3x3( m.e11 * s,
+ m.e12 * s,
+ m.e13 * s,
+ m.e21 * s,
+ m.e22 * s,
+ m.e23 * s,
+ m.e31 * s,
+ m.e32 * s,
+ m.e33 * s);
}
inline Matrix3x3 operator*(float s, Matrix3x3 m)
{
- return Matrix3x3( m.e11*s,
- m.e12*s,
- m.e13*s,
- m.e21*s,
- m.e22*s,
- m.e23*s,
- m.e31*s,
- m.e32*s,
- m.e33*s);
+ return Matrix3x3( m.e11 * s,
+ m.e12 * s,
+ m.e13 * s,
+ m.e21 * s,
+ m.e22 * s,
+ m.e23 * s,
+ m.e31 * s,
+ m.e32 * s,
+ m.e33 * s);
}
inline Vector operator*(Matrix3x3 m, Vector u)
{
- return Vector( m.e11*u.x + m.e12*u.y + m.e13*u.z,
- m.e21*u.x + m.e22*u.y + m.e23*u.z,
- m.e31*u.x + m.e32*u.y + m.e33*u.z);
+ return Vector( m.e11 * u.x + m.e12 * u.y + m.e13 * u.z,
+ m.e21 * u.x + m.e22 * u.y + m.e23 * u.z,
+ m.e31 * u.x + m.e32 * u.y + m.e33 * u.z);
}
inline Vector operator*(Vector u, Matrix3x3 m)
{
- return Vector( u.x*m.e11 + u.y*m.e21 + u.z*m.e31,
- u.x*m.e12 + u.y*m.e22 + u.z*m.e32,
- u.x*m.e13 + u.y*m.e23 + u.z*m.e33);
+ return Vector( u.x * m.e11 + u.y * m.e21 + u.z * m.e31,
+ u.x * m.e12 + u.y * m.e22 + u.z * m.e32,
+ u.x * m.e13 + u.y * m.e23 + u.z * m.e33);
}
//------------------------------------------------------------------------//
// Quaternion Class and Quaternion functions
//------------------------------------------------------------------------//
-class Quaternion {
+class Quaternion
+{
public:
- float n; // number (scalar) part
- Vector v; // vector part: v.x, v.y, v.z
-
- Quaternion(void);
- Quaternion(float e0, float e1, float e2, float e3);
-
- float Magnitude(void);
- Vector GetVector(void);
- float GetScalar(void);
- Quaternion operator+=(Quaternion q);
- Quaternion operator-=(Quaternion q);
- Quaternion operator*=(float s);
- Quaternion operator/=(float s);
- Quaternion operator~(void) const { return Quaternion(n, -v.x, -v.y, -v.z);}
+ float n; // number (scalar) part
+ Vector v; // vector part: v.x, v.y, v.z
+
+ Quaternion(void);
+ Quaternion(float e0, float e1, float e2, float e3);
+
+ float Magnitude(void);
+ Vector GetVector(void);
+ float GetScalar(void);
+ Quaternion operator+=(Quaternion q);
+ Quaternion operator-=(Quaternion q);
+ Quaternion operator*=(float s);
+ Quaternion operator/=(float s);
+ Quaternion operator~(void) const {
+ return Quaternion(n, -v.x, -v.y, -v.z);
+ }
};
inline Quaternion operator+(Quaternion q1, Quaternion q2);
inline Quaternion::Quaternion(void)
{
- n = 0;
- v.x = 0;
- v.y = 0;
- v.z = 0;
+ n = 0;
+ v.x = 0;
+ v.y = 0;
+ v.z = 0;
}
inline Quaternion::Quaternion(float e0, float e1, float e2, float e3)
{
- n = e0;
- v.x = e1;
- v.y = e2;
- v.z = e3;
+ n = e0;
+ v.x = e1;
+ v.y = e2;
+ v.z = e3;
}
inline float Quaternion::Magnitude(void)
{
- return (float) sqrt(n*n + v.x*v.x + v.y*v.y + v.z*v.z);
+ return (float) sqrt(n * n + v.x * v.x + v.y * v.y + v.z * v.z);
}
inline Vector Quaternion::GetVector(void)
{
- return Vector(v.x, v.y, v.z);
+ return Vector(v.x, v.y, v.z);
}
inline float Quaternion::GetScalar(void)
{
- return n;
+ return n;
}
inline Quaternion Quaternion::operator+=(Quaternion q)
{
- n += q.n;
- v.x += q.v.x;
- v.y += q.v.y;
- v.z += q.v.z;
- return *this;
+ n += q.n;
+ v.x += q.v.x;
+ v.y += q.v.y;
+ v.z += q.v.z;
+ return *this;
}
inline Quaternion Quaternion::operator-=(Quaternion q)
{
- n -= q.n;
- v.x -= q.v.x;
- v.y -= q.v.y;
- v.z -= q.v.z;
- return *this;
+ n -= q.n;
+ v.x -= q.v.x;
+ v.y -= q.v.y;
+ v.z -= q.v.z;
+ return *this;
}
inline Quaternion Quaternion::operator*=(float s)
{
- n *= s;
- v.x *= s;
- v.y *= s;
- v.z *= s;
- return *this;
+ n *= s;
+ v.x *= s;
+ v.y *= s;
+ v.z *= s;
+ return *this;
}
inline Quaternion Quaternion::operator/=(float s)
{
- n /= s;
- v.x /= s;
- v.y /= s;
- v.z /= s;
- return *this;
+ n /= s;
+ v.x /= s;
+ v.y /= s;
+ v.z /= s;
+ return *this;
}
/*inline Quaternion Quaternion::operator~()
inline Quaternion operator+(Quaternion q1, Quaternion q2)
{
- return Quaternion( q1.n + q2.n,
- q1.v.x + q2.v.x,
- q1.v.y + q2.v.y,
- q1.v.z + q2.v.z);
+ return Quaternion( q1.n + q2.n,
+ q1.v.x + q2.v.x,
+ q1.v.y + q2.v.y,
+ q1.v.z + q2.v.z);
}
inline Quaternion operator-(Quaternion q1, Quaternion q2)
{
- return Quaternion( q1.n - q2.n,
- q1.v.x - q2.v.x,
- q1.v.y - q2.v.y,
- q1.v.z - q2.v.z);
+ return Quaternion( q1.n - q2.n,
+ q1.v.x - q2.v.x,
+ q1.v.y - q2.v.y,
+ q1.v.z - q2.v.z);
}
inline Quaternion operator*(Quaternion q1, Quaternion q2)
{
- return Quaternion( q1.n*q2.n - q1.v.x*q2.v.x - q1.v.y*q2.v.y - q1.v.z*q2.v.z,
- q1.n*q2.v.x + q1.v.x*q2.n + q1.v.y*q2.v.z - q1.v.z*q2.v.y,
- q1.n*q2.v.y + q1.v.y*q2.n + q1.v.z*q2.v.x - q1.v.x*q2.v.z,
- q1.n*q2.v.z + q1.v.z*q2.n + q1.v.x*q2.v.y - q1.v.y*q2.v.x);
+ return Quaternion( q1.n * q2.n - q1.v.x * q2.v.x - q1.v.y * q2.v.y - q1.v.z * q2.v.z,
+ q1.n * q2.v.x + q1.v.x * q2.n + q1.v.y * q2.v.z - q1.v.z * q2.v.y,
+ q1.n * q2.v.y + q1.v.y * q2.n + q1.v.z * q2.v.x - q1.v.x * q2.v.z,
+ q1.n * q2.v.z + q1.v.z * q2.n + q1.v.x * q2.v.y - q1.v.y * q2.v.x);
}
inline Quaternion operator*(Quaternion q, float s)
{
- return Quaternion(q.n*s, q.v.x*s, q.v.y*s, q.v.z*s);
+ return Quaternion(q.n * s, q.v.x * s, q.v.y * s, q.v.z * s);
}
inline Quaternion operator*(float s, Quaternion q)
{
- return Quaternion(q.n*s, q.v.x*s, q.v.y*s, q.v.z*s);
+ return Quaternion(q.n * s, q.v.x * s, q.v.y * s, q.v.z * s);
}
inline Quaternion operator*(Quaternion q, Vector v)
{
- return Quaternion( -(q.v.x*v.x + q.v.y*v.y + q.v.z*v.z),
- q.n*v.x + q.v.y*v.z - q.v.z*v.y,
- q.n*v.y + q.v.z*v.x - q.v.x*v.z,
- q.n*v.z + q.v.x*v.y - q.v.y*v.x);
+ return Quaternion( -(q.v.x * v.x + q.v.y * v.y + q.v.z * v.z),
+ q.n * v.x + q.v.y * v.z - q.v.z * v.y,
+ q.n * v.y + q.v.z * v.x - q.v.x * v.z,
+ q.n * v.z + q.v.x * v.y - q.v.y * v.x);
}
inline Quaternion operator*(Vector v, Quaternion q)
{
- return Quaternion( -(q.v.x*v.x + q.v.y*v.y + q.v.z*v.z),
- q.n*v.x + q.v.z*v.y - q.v.y*v.z,
- q.n*v.y + q.v.x*v.z - q.v.z*v.x,
- q.n*v.z + q.v.y*v.x - q.v.x*v.y);
+ return Quaternion( -(q.v.x * v.x + q.v.y * v.y + q.v.z * v.z),
+ q.n * v.x + q.v.z * v.y - q.v.y * v.z,
+ q.n * v.y + q.v.x * v.z - q.v.z * v.x,
+ q.n * v.z + q.v.y * v.x - q.v.x * v.y);
}
inline Quaternion operator/(Quaternion q, float s)
{
- return Quaternion(q.n/s, q.v.x/s, q.v.y/s, q.v.z/s);
+ return Quaternion(q.n / s, q.v.x / s, q.v.y / s, q.v.z / s);
}
inline float QGetAngle(Quaternion q)
{
- return (float) (2*acosf(q.n));
+ return (float) (2 * acosf(q.n));
}
inline Vector QGetAxis(Quaternion q)
{
- Vector v;
- float m;
+ Vector v;
+ float m;
- v = q.GetVector();
- m = v.Magnitude();
+ v = q.GetVector();
+ m = v.Magnitude();
- if (m <= tol)
- return Vector();
- else
- return v/m;
+ if (m <= tol)
+ return Vector();
+ else
+ return v / m;
}
inline Quaternion QRotate(Quaternion q1, Quaternion q2)
{
- return q1*q2*(~q1);
+ return q1 * q2 * (~q1);
}
inline Vector QVRotate(Quaternion q, Vector v)
{
- Quaternion t;
+ Quaternion t;
- t = q*v*(~q);
+ t = q * v * (~q);
- return t.GetVector();
+ return t.GetVector();
}
inline Quaternion MakeQFromEulerAngles(float x, float y, float z)
{
- Quaternion q;
- double roll = DegreesToRadians(x);
- double pitch = DegreesToRadians(y);
- double yaw = DegreesToRadians(z);
+ Quaternion q;
+ double roll = DegreesToRadians(x);
+ double pitch = DegreesToRadians(y);
+ double yaw = DegreesToRadians(z);
- double cyaw, cpitch, croll, syaw, spitch, sroll;
- double cyawcpitch, syawspitch, cyawspitch, syawcpitch;
+ double cyaw, cpitch, croll, syaw, spitch, sroll;
+ double cyawcpitch, syawspitch, cyawspitch, syawcpitch;
- cyaw = cos(0.5f * yaw);
- cpitch = cos(0.5f * pitch);
- croll = cos(0.5f * roll);
- syaw = sin(0.5f * yaw);
- spitch = sin(0.5f * pitch);
- sroll = sin(0.5f * roll);
+ cyaw = cos(0.5f * yaw);
+ cpitch = cos(0.5f * pitch);
+ croll = cos(0.5f * roll);
+ syaw = sin(0.5f * yaw);
+ spitch = sin(0.5f * pitch);
+ sroll = sin(0.5f * roll);
- cyawcpitch = cyaw*cpitch;
- syawspitch = syaw*spitch;
- cyawspitch = cyaw*spitch;
- syawcpitch = syaw*cpitch;
+ cyawcpitch = cyaw * cpitch;
+ syawspitch = syaw * spitch;
+ cyawspitch = cyaw * spitch;
+ syawcpitch = syaw * cpitch;
- q.n = (float) (cyawcpitch * croll + syawspitch * sroll);
- q.v.x = (float) (cyawcpitch * sroll - syawspitch * croll);
- q.v.y = (float) (cyawspitch * croll + syawcpitch * sroll);
- q.v.z = (float) (syawcpitch * croll - cyawspitch * sroll);
+ q.n = (float) (cyawcpitch * croll + syawspitch * sroll);
+ q.v.x = (float) (cyawcpitch * sroll - syawspitch * croll);
+ q.v.y = (float) (cyawspitch * croll + syawcpitch * sroll);
+ q.v.z = (float) (syawcpitch * croll - cyawspitch * sroll);
- return q;
+ return q;
}
inline Vector MakeEulerAnglesFromQ(Quaternion q)
{
- double r11, r21, r31, r32, r33;
- double q00, q11, q22, q33;
- double tmp;
- Vector u;
-
- q00 = q.n * q.n;
- q11 = q.v.x * q.v.x;
- q22 = q.v.y * q.v.y;
- q33 = q.v.z * q.v.z;
-
- r11 = q00 + q11 - q22 - q33;
- r21 = 2 * (q.v.x*q.v.y + q.n*q.v.z);
- r31 = 2 * (q.v.x*q.v.z - q.n*q.v.y);
- r32 = 2 * (q.v.y*q.v.z + q.n*q.v.x);
- r33 = q00 - q11 - q22 + q33;
-
- tmp = fabs(r31);
- if(tmp > 0.999999)
- {
- double r12 = 2 * (q.v.x*q.v.y - q.n*q.v.z);
- double r13 = 2 * (q.v.x*q.v.z + q.n*q.v.y);
-
- u.x = RadiansToDegrees(0.0f); //roll
- u.y = RadiansToDegrees((float) (-(pi/2) * r31/tmp)); // pitch
- u.z = RadiansToDegrees((float) atan2(-r12, -r31*r13)); // yaw
- return u;
- }
-
- u.x = RadiansToDegrees((float) atan2(r32, r33)); // roll
- u.y = RadiansToDegrees((float) asinf(-r31)); // pitch
- u.z = RadiansToDegrees((float) atan2(r21, r11)); // yaw
- return u;
+ double r11, r21, r31, r32, r33;
+ double q00, q11, q22, q33;
+ double tmp;
+ Vector u;
+
+ q00 = q.n * q.n;
+ q11 = q.v.x * q.v.x;
+ q22 = q.v.y * q.v.y;
+ q33 = q.v.z * q.v.z;
+
+ r11 = q00 + q11 - q22 - q33;
+ r21 = 2 * (q.v.x * q.v.y + q.n * q.v.z);
+ r31 = 2 * (q.v.x * q.v.z - q.n * q.v.y);
+ r32 = 2 * (q.v.y * q.v.z + q.n * q.v.x);
+ r33 = q00 - q11 - q22 + q33;
+
+ tmp = fabs(r31);
+ if (tmp > 0.999999) {
+ double r12 = 2 * (q.v.x * q.v.y - q.n * q.v.z);
+ double r13 = 2 * (q.v.x * q.v.z + q.n * q.v.y);
+
+ u.x = RadiansToDegrees(0.0f); //roll
+ u.y = RadiansToDegrees((float) (-(pi / 2) * r31 / tmp)); // pitch
+ u.z = RadiansToDegrees((float) atan2(-r12, -r31 * r13)); // yaw
+ return u;
+ }
+
+ u.x = RadiansToDegrees((float) atan2(r32, r33)); // roll
+ u.y = RadiansToDegrees((float) asinf(-r31)); // pitch
+ u.z = RadiansToDegrees((float) atan2(r21, r11)); // yaw
+ return u;
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
// Functions
quaternion Quat_Mult(quaternion q1, quaternion q2)
{
- quaternion QResult;
- float a, b, c, d, e, f, g, h;
- a = (q1.w + q1.x) * (q2.w + q2.x);
- b = (q1.z - q1.y) * (q2.y - q2.z);
- c = (q1.w - q1.x) * (q2.y + q2.z);
- d = (q1.y + q1.z) * (q2.w - q2.x);
- e = (q1.x + q1.z) * (q2.x + q2.y);
- f = (q1.x - q1.z) * (q2.x - q2.y);
- g = (q1.w + q1.y) * (q2.w - q2.z);
- h = (q1.w - q1.y) * (q2.w + q2.z);
- QResult.w = b + (-e - f + g + h) / 2;
- QResult.x = a - (e + f + g + h) / 2;
- QResult.y = c + (e - f + g - h) / 2;
- QResult.z = d + (e - f - g + h) / 2;
- return QResult;
+ quaternion QResult;
+ float a, b, c, d, e, f, g, h;
+ a = (q1.w + q1.x) * (q2.w + q2.x);
+ b = (q1.z - q1.y) * (q2.y - q2.z);
+ c = (q1.w - q1.x) * (q2.y + q2.z);
+ d = (q1.y + q1.z) * (q2.w - q2.x);
+ e = (q1.x + q1.z) * (q2.x + q2.y);
+ f = (q1.x - q1.z) * (q2.x - q2.y);
+ g = (q1.w + q1.y) * (q2.w - q2.z);
+ h = (q1.w - q1.y) * (q2.w + q2.z);
+ QResult.w = b + (-e - f + g + h) / 2;
+ QResult.x = a - (e + f + g + h) / 2;
+ QResult.y = c + (e - f + g - h) / 2;
+ QResult.z = d + (e - f - g + h) / 2;
+ return QResult;
}
quaternion To_Quat(Matrix_t m)
{
- // From Jason Shankel, (C) 2000.
- static quaternion Quat;
-
- static double Tr = m[0][0] + m[1][1] + m[2][2] + 1.0, fourD;
- static double q[4];
-
- static int i,j,k;
- if (Tr >= 1.0)
- {
- fourD = 2.0*fast_sqrt(Tr);
- q[3] = fourD/4.0;
- q[0] = (m[2][1] - m[1][2]) / fourD;
- q[1] = (m[0][2] - m[2][0]) / fourD;
- q[2] = (m[1][0] - m[0][1]) / fourD;
- }
- else
- {
- if (m[0][0] > m[1][1])
- {
- i = 0;
- }
- else
- {
- i = 1;
- }
- if (m[2][2] > m[i][i])
- {
- i = 2;
- }
- j = (i+1)%3;
- k = (j+1)%3;
- fourD = 2.0*fast_sqrt(m[i][i] - m[j][j] - m[k][k] + 1.0);
- q[i] = fourD / 4.0;
- q[j] = (m[j][i] + m[i][j]) / fourD;
- q[k] = (m[k][i] + m[i][k]) / fourD;
- q[3] = (m[j][k] - m[k][j]) / fourD;
- }
-
- Quat.x = q[0];
- Quat.y = q[1];
- Quat.z = q[2];
- Quat.w = q[3];
- return Quat;
+ // From Jason Shankel, (C) 2000.
+ static quaternion Quat;
+
+ static double Tr = m[0][0] + m[1][1] + m[2][2] + 1.0, fourD;
+ static double q[4];
+
+ static int i, j, k;
+ if (Tr >= 1.0) {
+ fourD = 2.0 * fast_sqrt(Tr);
+ q[3] = fourD / 4.0;
+ q[0] = (m[2][1] - m[1][2]) / fourD;
+ q[1] = (m[0][2] - m[2][0]) / fourD;
+ q[2] = (m[1][0] - m[0][1]) / fourD;
+ } else {
+ if (m[0][0] > m[1][1]) {
+ i = 0;
+ } else {
+ i = 1;
+ }
+ if (m[2][2] > m[i][i]) {
+ i = 2;
+ }
+ j = (i + 1) % 3;
+ k = (j + 1) % 3;
+ fourD = 2.0 * fast_sqrt(m[i][i] - m[j][j] - m[k][k] + 1.0);
+ q[i] = fourD / 4.0;
+ q[j] = (m[j][i] + m[i][j]) / fourD;
+ q[k] = (m[k][i] + m[i][k]) / fourD;
+ q[3] = (m[j][k] - m[k][j]) / fourD;
+ }
+
+ Quat.x = q[0];
+ Quat.y = q[1];
+ Quat.z = q[2];
+ Quat.w = q[3];
+ return Quat;
}
void Quat_2_Matrix(quaternion Quat, Matrix_t m)
{
- // From the GLVelocity site (http://glvelocity.gamedev.net)
- float fW = Quat.w;
- float fX = Quat.x;
- float fY = Quat.y;
- float fZ = Quat.z;
- float fXX = fX * fX;
- float fYY = fY * fY;
- float fZZ = fZ * fZ;
- m[0][0] = 1.0f - 2.0f * (fYY + fZZ);
- m[1][0] = 2.0f * (fX * fY + fW * fZ);
- m[2][0] = 2.0f * (fX * fZ - fW * fY);
- m[3][0] = 0.0f;
- m[0][1] = 2.0f * (fX * fY - fW * fZ);
- m[1][1] = 1.0f - 2.0f * (fXX + fZZ);
- m[2][1] = 2.0f * (fY * fZ + fW * fX);
- m[3][1] = 0.0f;
- m[0][2] = 2.0f * (fX * fZ + fW * fY);
- m[1][2] = 2.0f * (fX * fZ - fW * fX);
- m[2][2] = 1.0f - 2.0f * (fXX + fYY);
- m[3][2] = 0.0f;
- m[0][3] = 0.0f;
- m[1][3] = 0.0f;
- m[2][3] = 0.0f;
- m[3][3] = 1.0f;
+ // From the GLVelocity site (http://glvelocity.gamedev.net)
+ float fW = Quat.w;
+ float fX = Quat.x;
+ float fY = Quat.y;
+ float fZ = Quat.z;
+ float fXX = fX * fX;
+ float fYY = fY * fY;
+ float fZZ = fZ * fZ;
+ m[0][0] = 1.0f - 2.0f * (fYY + fZZ);
+ m[1][0] = 2.0f * (fX * fY + fW * fZ);
+ m[2][0] = 2.0f * (fX * fZ - fW * fY);
+ m[3][0] = 0.0f;
+ m[0][1] = 2.0f * (fX * fY - fW * fZ);
+ m[1][1] = 1.0f - 2.0f * (fXX + fZZ);
+ m[2][1] = 2.0f * (fY * fZ + fW * fX);
+ m[3][1] = 0.0f;
+ m[0][2] = 2.0f * (fX * fZ + fW * fY);
+ m[1][2] = 2.0f * (fX * fZ - fW * fX);
+ m[2][2] = 1.0f - 2.0f * (fXX + fYY);
+ m[3][2] = 0.0f;
+ m[0][3] = 0.0f;
+ m[1][3] = 0.0f;
+ m[2][3] = 0.0f;
+ m[3][3] = 1.0f;
}
quaternion To_Quat(angle_axis Ang_Ax)
{
- // From the Quaternion Powers article on gamedev.net
- static quaternion Quat;
-
- Quat.x = Ang_Ax.x * sin(Ang_Ax.angle / 2);
- Quat.y = Ang_Ax.y * sin(Ang_Ax.angle / 2);
- Quat.z = Ang_Ax.z * sin(Ang_Ax.angle / 2);
- Quat.w = cos(Ang_Ax.angle / 2);
- return Quat;
+ // From the Quaternion Powers article on gamedev.net
+ static quaternion Quat;
+
+ Quat.x = Ang_Ax.x * sin(Ang_Ax.angle / 2);
+ Quat.y = Ang_Ax.y * sin(Ang_Ax.angle / 2);
+ Quat.z = Ang_Ax.z * sin(Ang_Ax.angle / 2);
+ Quat.w = cos(Ang_Ax.angle / 2);
+ return Quat;
}
angle_axis Quat_2_AA(quaternion Quat)
{
- static angle_axis Ang_Ax;
- static float scale, tw;
- tw = (float)acosf(Quat.w) * 2;
- scale = (float)sin(tw / 2.0);
- Ang_Ax.x = Quat.x / scale;
- Ang_Ax.y = Quat.y / scale;
- Ang_Ax.z = Quat.z / scale;
-
- Ang_Ax.angle = 2.0 * acosf(Quat.w)/(float)PI*180;
- return Ang_Ax;
+ static angle_axis Ang_Ax;
+ static float scale, tw;
+ tw = (float)acosf(Quat.w) * 2;
+ scale = (float)sin(tw / 2.0);
+ Ang_Ax.x = Quat.x / scale;
+ Ang_Ax.y = Quat.y / scale;
+ Ang_Ax.z = Quat.z / scale;
+
+ Ang_Ax.angle = 2.0 * acosf(Quat.w) / (float)PI * 180;
+ return Ang_Ax;
}
quaternion To_Quat(int In_Degrees, euler Euler)
{
- // From the gamasutra quaternion article
- static quaternion Quat;
- static float cr, cp, cy, sr, sp, sy, cpcy, spsy;
- //If we are in Degree mode, convert to Radians
- if (In_Degrees) {
- Euler.x = Euler.x * (float)PI / 180;
- Euler.y = Euler.y * (float)PI / 180;
- Euler.z = Euler.z * (float)PI / 180;
- }
- //Calculate trig identities
- //Formerly roll, pitch, yaw
- cr = float(cos(Euler.x/2));
- cp = float(cos(Euler.y/2));
- cy = float(cos(Euler.z/2));
- sr = float(sin(Euler.x/2));
- sp = float(sin(Euler.y/2));
- sy = float(sin(Euler.z/2));
-
- cpcy = cp * cy;
- spsy = sp * sy;
- Quat.w = cr * cpcy + sr * spsy;
- Quat.x = sr * cpcy - cr * spsy;
- Quat.y = cr * sp * cy + sr * cp * sy;
- Quat.z = cr * cp * sy - sr * sp * cy;
-
- return Quat;
+ // From the gamasutra quaternion article
+ static quaternion Quat;
+ static float cr, cp, cy, sr, sp, sy, cpcy, spsy;
+ //If we are in Degree mode, convert to Radians
+ if (In_Degrees) {
+ Euler.x = Euler.x * (float)PI / 180;
+ Euler.y = Euler.y * (float)PI / 180;
+ Euler.z = Euler.z * (float)PI / 180;
+ }
+ //Calculate trig identities
+ //Formerly roll, pitch, yaw
+ cr = float(cos(Euler.x / 2));
+ cp = float(cos(Euler.y / 2));
+ cy = float(cos(Euler.z / 2));
+ sr = float(sin(Euler.x / 2));
+ sp = float(sin(Euler.y / 2));
+ sy = float(sin(Euler.z / 2));
+
+ cpcy = cp * cy;
+ spsy = sp * sy;
+ Quat.w = cr * cpcy + sr * spsy;
+ Quat.x = sr * cpcy - cr * spsy;
+ Quat.y = cr * sp * cy + sr * cp * sy;
+ Quat.z = cr * cp * sy - sr * sp * cy;
+
+ return Quat;
}
quaternion QNormalize(quaternion Quat)
{
- static float norm;
- norm = Quat.x * Quat.x +
- Quat.y * Quat.y +
- Quat.z * Quat.z +
- Quat.w * Quat.w;
- Quat.x = float(Quat.x / norm);
- Quat.y = float(Quat.y / norm);
- Quat.z = float(Quat.z / norm);
- Quat.w = float(Quat.w / norm);
- return Quat;
+ static float norm;
+ norm = Quat.x * Quat.x +
+ Quat.y * Quat.y +
+ Quat.z * Quat.z +
+ Quat.w * Quat.w;
+ Quat.x = float(Quat.x / norm);
+ Quat.y = float(Quat.y / norm);
+ Quat.z = float(Quat.z / norm);
+ Quat.w = float(Quat.w / norm);
+ return Quat;
}
XYZ Quat2Vector(quaternion Quat)
{
- QNormalize(Quat);
+ QNormalize(Quat);
- float fW = Quat.w;
- float fX = Quat.x;
- float fY = Quat.y;
- float fZ = Quat.z;
+ float fW = Quat.w;
+ float fX = Quat.x;
+ float fY = Quat.y;
+ float fZ = Quat.z;
- XYZ tempvec;
+ XYZ tempvec;
- tempvec.x = 2.0f*(fX*fZ-fW*fY);
- tempvec.y = 2.0f*(fY*fZ+fW*fX);
- tempvec.z = 1.0f-2.0f*(fX*fX+fY*fY);
+ tempvec.x = 2.0f * (fX * fZ - fW * fY);
+ tempvec.y = 2.0f * (fY * fZ + fW * fX);
+ tempvec.z = 1.0f - 2.0f * (fX * fX + fY * fY);
- return tempvec;
+ return tempvec;
}
bool PointInTriangle(Vector *p, Vector normal, float p11, float p12, float p13, float p21, float p22, float p23, float p31, float p32, float p33)
{
- static float u0, u1, u2;
- static float v0, v1, v2;
- static float a, b;
- static float max;
- static int i, j;
- static bool bInter;
- static float pointv[3];
- static float p1v[3];
- static float p2v[3];
- static float p3v[3];
- static float normalv[3];
+ static float u0, u1, u2;
+ static float v0, v1, v2;
+ static float a, b;
+ static float max;
+ static int i, j;
+ static bool bInter;
+ static float pointv[3];
+ static float p1v[3];
+ static float p2v[3];
+ static float p3v[3];
+ static float normalv[3];
- bInter=0;
+ bInter = 0;
- pointv[0]=p->x;
- pointv[1]=p->y;
- pointv[2]=p->z;
+ pointv[0] = p->x;
+ pointv[1] = p->y;
+ pointv[2] = p->z;
- p1v[0]=p11;
- p1v[1]=p12;
- p1v[2]=p13;
+ p1v[0] = p11;
+ p1v[1] = p12;
+ p1v[2] = p13;
- p2v[0]=p21;
- p2v[1]=p22;
- p2v[2]=p23;
+ p2v[0] = p21;
+ p2v[1] = p22;
+ p2v[2] = p23;
- p3v[0]=p31;
- p3v[1]=p32;
- p3v[2]=p33;
+ p3v[0] = p31;
+ p3v[1] = p32;
+ p3v[2] = p33;
- normalv[0]=normal.x;
- normalv[1]=normal.y;
- normalv[2]=normal.z;
+ normalv[0] = normal.x;
+ normalv[1] = normal.y;
+ normalv[2] = normal.z;
#define ABS(X) (((X)<0.f)?-(X):(X) )
-#define MAX(A, B) (((A)<(B))?(B):(A))
- max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
+#define MAX(A, B) (((A)<(B))?(B):(A))
+ max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
#undef MAX
- if (max == ABS(normalv[0])) {i = 1; j = 2;} // y, z
- if (max == ABS(normalv[1])) {i = 0; j = 2;} // x, z
- if (max == ABS(normalv[2])) {i = 0; j = 1;} // x, y
+ if (max == ABS(normalv[0])) {
+ i = 1; // y, z
+ j = 2;
+ }
+ if (max == ABS(normalv[1])) {
+ i = 0; // x, z
+ j = 2;
+ }
+ if (max == ABS(normalv[2])) {
+ i = 0; // x, y
+ j = 1;
+ }
#undef ABS
- u0 = pointv[i] - p1v[i];
- v0 = pointv[j] - p1v[j];
- u1 = p2v[i] - p1v[i];
- v1 = p2v[j] - p1v[j];
- u2 = p3v[i] - p1v[i];
- v2 = p3v[j] - p1v[j];
-
- if (u1 > -1.0e-05f && u1 < 1.0e-05f)// == 0.0f)
- {
- b = u0 / u2;
- if (0.0f <= b && b <= 1.0f)
- {
- a = (v0 - b * v2) / v1;
- if ((a >= 0.0f) && (( a + b ) <= 1.0f))
- bInter = 1;
- }
- }
- else
- {
- b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
- if (0.0f <= b && b <= 1.0f)
- {
- a = (u0 - b * u2) / u1;
- if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
- bInter = 1;
- }
- }
-
- return bInter;
+ u0 = pointv[i] - p1v[i];
+ v0 = pointv[j] - p1v[j];
+ u1 = p2v[i] - p1v[i];
+ v1 = p2v[j] - p1v[j];
+ u2 = p3v[i] - p1v[i];
+ v2 = p3v[j] - p1v[j];
+
+ if (u1 > -1.0e-05f && u1 < 1.0e-05f) { // == 0.0f)
+ b = u0 / u2;
+ if (0.0f <= b && b <= 1.0f) {
+ a = (v0 - b * v2) / v1;
+ if ((a >= 0.0f) && (( a + b ) <= 1.0f))
+ bInter = 1;
+ }
+ } else {
+ b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
+ if (0.0f <= b && b <= 1.0f) {
+ a = (u0 - b * u2) / u1;
+ if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
+ bInter = 1;
+ }
+ }
+
+ return bInter;
}
-bool LineFacet(Vector p1,Vector p2,Vector pa,Vector pb,Vector pc,Vector *p)
+bool LineFacet(Vector p1, Vector p2, Vector pa, Vector pb, Vector pc, Vector *p)
{
- static float d;
- static float a1,a2,a3;
- static float total,denom,mu;
- static Vector n,pa1,pa2,pa3;
-
- //Calculate the parameters for the plane
- n.x = (pb.y - pa.y)*(pc.z - pa.z) - (pb.z - pa.z)*(pc.y - pa.y);
- n.y = (pb.z - pa.z)*(pc.x - pa.x) - (pb.x - pa.x)*(pc.z - pa.z);
- n.z = (pb.x - pa.x)*(pc.y - pa.y) - (pb.y - pa.y)*(pc.x - pa.x);
- n.Normalize();
- d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
-
- //Calculate the position on the line that intersects the plane
- denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
- if (fabs(denom) < 0.0000001) // Line and plane don't intersect
- return 0;
- mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
- p->x = p1.x + mu * (p2.x - p1.x);
- p->y = p1.y + mu * (p2.y - p1.y);
- p->z = p1.z + mu * (p2.z - p1.z);
- if (mu < 0 || mu > 1) // Intersection not along line segment
- return 0;
-
- if(!PointInTriangle( p, n, pa.x, pa.y, pa.z, pb.x, pb.y, pb.z, pc.x, pc.y, pc.z)){return 0;}
-
- return 1;
+ static float d;
+ static float a1, a2, a3;
+ static float total, denom, mu;
+ static Vector n, pa1, pa2, pa3;
+
+ //Calculate the parameters for the plane
+ n.x = (pb.y - pa.y) * (pc.z - pa.z) - (pb.z - pa.z) * (pc.y - pa.y);
+ n.y = (pb.z - pa.z) * (pc.x - pa.x) - (pb.x - pa.x) * (pc.z - pa.z);
+ n.z = (pb.x - pa.x) * (pc.y - pa.y) - (pb.y - pa.y) * (pc.x - pa.x);
+ n.Normalize();
+ d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
+
+ //Calculate the position on the line that intersects the plane
+ denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
+ if (fabs(denom) < 0.0000001) // Line and plane don't intersect
+ return 0;
+ mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
+ p->x = p1.x + mu * (p2.x - p1.x);
+ p->y = p1.y + mu * (p2.y - p1.y);
+ p->z = p1.z + mu * (p2.z - p1.z);
+ if (mu < 0 || mu > 1) // Intersection not along line segment
+ return 0;
+
+ if (!PointInTriangle( p, n, pa.x, pa.y, pa.z, pb.x, pb.y, pb.z, pc.x, pc.y, pc.z)) {
+ return 0;
+ }
+
+ return 1;
}
bool PointInTriangle(XYZ *p, XYZ normal, XYZ *p1, XYZ *p2, XYZ *p3)
{
- static float u0, u1, u2;
- static float v0, v1, v2;
- static float a, b;
- static float max;
- static int i, j;
- static bool bInter = 0;
- static float pointv[3];
- static float p1v[3];
- static float p2v[3];
- static float p3v[3];
- static float normalv[3];
+ static float u0, u1, u2;
+ static float v0, v1, v2;
+ static float a, b;
+ static float max;
+ static int i, j;
+ static bool bInter = 0;
+ static float pointv[3];
+ static float p1v[3];
+ static float p2v[3];
+ static float p3v[3];
+ static float normalv[3];
- bInter=0;
+ bInter = 0;
- pointv[0]=p->x;
- pointv[1]=p->y;
- pointv[2]=p->z;
+ pointv[0] = p->x;
+ pointv[1] = p->y;
+ pointv[2] = p->z;
- p1v[0]=p1->x;
- p1v[1]=p1->y;
- p1v[2]=p1->z;
+ p1v[0] = p1->x;
+ p1v[1] = p1->y;
+ p1v[2] = p1->z;
- p2v[0]=p2->x;
- p2v[1]=p2->y;
- p2v[2]=p2->z;
+ p2v[0] = p2->x;
+ p2v[1] = p2->y;
+ p2v[2] = p2->z;
- p3v[0]=p3->x;
- p3v[1]=p3->y;
- p3v[2]=p3->z;
+ p3v[0] = p3->x;
+ p3v[1] = p3->y;
+ p3v[2] = p3->z;
- normalv[0]=normal.x;
- normalv[1]=normal.y;
- normalv[2]=normal.z;
+ normalv[0] = normal.x;
+ normalv[1] = normal.y;
+ normalv[2] = normal.z;
#define ABS(X) (((X)<0.f)?-(X):(X) )
-#define MAX(A, B) (((A)<(B))?(B):(A))
- max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
+#define MAX(A, B) (((A)<(B))?(B):(A))
+ max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
#undef MAX
- if (max == ABS(normalv[0])) {i = 1; j = 2;} // y, z
- if (max == ABS(normalv[1])) {i = 0; j = 2;} // x, z
- if (max == ABS(normalv[2])) {i = 0; j = 1;} // x, y
+ if (max == ABS(normalv[0])) {
+ i = 1; // y, z
+ j = 2;
+ }
+ if (max == ABS(normalv[1])) {
+ i = 0; // x, z
+ j = 2;
+ }
+ if (max == ABS(normalv[2])) {
+ i = 0; // x, y
+ j = 1;
+ }
#undef ABS
- u0 = pointv[i] - p1v[i];
- v0 = pointv[j] - p1v[j];
- u1 = p2v[i] - p1v[i];
- v1 = p2v[j] - p1v[j];
- u2 = p3v[i] - p1v[i];
- v2 = p3v[j] - p1v[j];
-
- if (u1 > -1.0e-05f && u1 < 1.0e-05f)// == 0.0f)
- {
- b = u0 / u2;
- if (0.0f <= b && b <= 1.0f)
- {
- a = (v0 - b * v2) / v1;
- if ((a >= 0.0f) && (( a + b ) <= 1.0f))
- bInter = 1;
- }
- }
- else
- {
- b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
- if (0.0f <= b && b <= 1.0f)
- {
- a = (u0 - b * u2) / u1;
- if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
- bInter = 1;
- }
- }
-
- return bInter;
+ u0 = pointv[i] - p1v[i];
+ v0 = pointv[j] - p1v[j];
+ u1 = p2v[i] - p1v[i];
+ v1 = p2v[j] - p1v[j];
+ u2 = p3v[i] - p1v[i];
+ v2 = p3v[j] - p1v[j];
+
+ if (u1 > -1.0e-05f && u1 < 1.0e-05f) { // == 0.0f)
+ b = u0 / u2;
+ if (0.0f <= b && b <= 1.0f) {
+ a = (v0 - b * v2) / v1;
+ if ((a >= 0.0f) && (( a + b ) <= 1.0f))
+ bInter = 1;
+ }
+ } else {
+ b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
+ if (0.0f <= b && b <= 1.0f) {
+ a = (u0 - b * u2) / u1;
+ if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
+ bInter = 1;
+ }
+ }
+
+ return bInter;
}
-bool LineFacet(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ *p)
+bool LineFacet(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ *p)
{
- static float d;
- static float a1,a2,a3;
- static float total,denom,mu;
- static XYZ n,pa1,pa2,pa3;
-
- //Calculate the parameters for the plane
- n.x = (pb.y - pa.y)*(pc.z - pa.z) - (pb.z - pa.z)*(pc.y - pa.y);
- n.y = (pb.z - pa.z)*(pc.x - pa.x) - (pb.x - pa.x)*(pc.z - pa.z);
- n.z = (pb.x - pa.x)*(pc.y - pa.y) - (pb.y - pa.y)*(pc.x - pa.x);
- Normalise(&n);
- d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
-
- //Calculate the position on the line that intersects the plane
- denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
- if (fabs(denom) < 0.0000001) // Line and plane don't intersect
- return 0;
- mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
- p->x = p1.x + mu * (p2.x - p1.x);
- p->y = p1.y + mu * (p2.y - p1.y);
- p->z = p1.z + mu * (p2.z - p1.z);
- if (mu < 0 || mu > 1) // Intersection not along line segment
- return 0;
-
- if(!PointInTriangle( p, n, &pa, &pb, &pc)){return 0;}
-
- return 1;
+ static float d;
+ static float a1, a2, a3;
+ static float total, denom, mu;
+ static XYZ n, pa1, pa2, pa3;
+
+ //Calculate the parameters for the plane
+ n.x = (pb.y - pa.y) * (pc.z - pa.z) - (pb.z - pa.z) * (pc.y - pa.y);
+ n.y = (pb.z - pa.z) * (pc.x - pa.x) - (pb.x - pa.x) * (pc.z - pa.z);
+ n.z = (pb.x - pa.x) * (pc.y - pa.y) - (pb.y - pa.y) * (pc.x - pa.x);
+ Normalise(&n);
+ d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
+
+ //Calculate the position on the line that intersects the plane
+ denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
+ if (fabs(denom) < 0.0000001) // Line and plane don't intersect
+ return 0;
+ mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
+ p->x = p1.x + mu * (p2.x - p1.x);
+ p->y = p1.y + mu * (p2.y - p1.y);
+ p->z = p1.z + mu * (p2.z - p1.z);
+ if (mu < 0 || mu > 1) // Intersection not along line segment
+ return 0;
+
+ if (!PointInTriangle( p, n, &pa, &pb, &pc)) {
+ return 0;
+ }
+
+ return 1;
}
-float LineFacetd(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ *p)
+float LineFacetd(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ *p)
{
- static float d;
- static float a1,a2,a3;
- static float total,denom,mu;
- static XYZ n,pa1,pa2,pa3;
-
- //Calculate the parameters for the plane
- n.x = (pb.y - pa.y)*(pc.z - pa.z) - (pb.z - pa.z)*(pc.y - pa.y);
- n.y = (pb.z - pa.z)*(pc.x - pa.x) - (pb.x - pa.x)*(pc.z - pa.z);
- n.z = (pb.x - pa.x)*(pc.y - pa.y) - (pb.y - pa.y)*(pc.x - pa.x);
- Normalise(&n);
- d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
-
- //Calculate the position on the line that intersects the plane
- denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
- if (fabs(denom) < 0.0000001) // Line and plane don't intersect
- return 0;
- mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
- p->x = p1.x + mu * (p2.x - p1.x);
- p->y = p1.y + mu * (p2.y - p1.y);
- p->z = p1.z + mu * (p2.z - p1.z);
- if (mu < 0 || mu > 1) // Intersection not along line segment
- return 0;
-
- if(!PointInTriangle( p, n, &pa, &pb, &pc)){return 0;}
-
- return 1;
+ static float d;
+ static float a1, a2, a3;
+ static float total, denom, mu;
+ static XYZ n, pa1, pa2, pa3;
+
+ //Calculate the parameters for the plane
+ n.x = (pb.y - pa.y) * (pc.z - pa.z) - (pb.z - pa.z) * (pc.y - pa.y);
+ n.y = (pb.z - pa.z) * (pc.x - pa.x) - (pb.x - pa.x) * (pc.z - pa.z);
+ n.z = (pb.x - pa.x) * (pc.y - pa.y) - (pb.y - pa.y) * (pc.x - pa.x);
+ Normalise(&n);
+ d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
+
+ //Calculate the position on the line that intersects the plane
+ denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
+ if (fabs(denom) < 0.0000001) // Line and plane don't intersect
+ return 0;
+ mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
+ p->x = p1.x + mu * (p2.x - p1.x);
+ p->y = p1.y + mu * (p2.y - p1.y);
+ p->z = p1.z + mu * (p2.z - p1.z);
+ if (mu < 0 || mu > 1) // Intersection not along line segment
+ return 0;
+
+ if (!PointInTriangle( p, n, &pa, &pb, &pc)) {
+ return 0;
+ }
+
+ return 1;
}
-float LineFacetd(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc, XYZ n, XYZ *p)
+float LineFacetd(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ n, XYZ *p)
{
- static float d;
- static float a1,a2,a3;
- static float total,denom,mu;
- static XYZ pa1,pa2,pa3;
-
- //Calculate the parameters for the plane
- d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
-
- //Calculate the position on the line that intersects the plane
- denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
- if (fabs(denom) < 0.0000001) // Line and plane don't intersect
- return 0;
- mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
- p->x = p1.x + mu * (p2.x - p1.x);
- p->y = p1.y + mu * (p2.y - p1.y);
- p->z = p1.z + mu * (p2.z - p1.z);
- if (mu < 0 || mu > 1) // Intersection not along line segment
- return 0;
-
- if(!PointInTriangle( p, n, &pa, &pb, &pc)){return 0;}
- return 1;
+ static float d;
+ static float a1, a2, a3;
+ static float total, denom, mu;
+ static XYZ pa1, pa2, pa3;
+
+ //Calculate the parameters for the plane
+ d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
+
+ //Calculate the position on the line that intersects the plane
+ denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
+ if (fabs(denom) < 0.0000001) // Line and plane don't intersect
+ return 0;
+ mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
+ p->x = p1.x + mu * (p2.x - p1.x);
+ p->y = p1.y + mu * (p2.y - p1.y);
+ p->z = p1.z + mu * (p2.z - p1.z);
+ if (mu < 0 || mu > 1) // Intersection not along line segment
+ return 0;
+
+ if (!PointInTriangle( p, n, &pa, &pb, &pc)) {
+ return 0;
+ }
+ return 1;
}
-float LineFacetd(XYZ *p1,XYZ *p2,XYZ *pa,XYZ *pb,XYZ *pc, XYZ *p)
+float LineFacetd(XYZ *p1, XYZ *p2, XYZ *pa, XYZ *pb, XYZ *pc, XYZ *p)
{
- static float d;
- static float a1,a2,a3;
- static float total,denom,mu;
- static XYZ pa1,pa2,pa3,n;
-
- //Calculate the parameters for the plane
- n.x = (pb->y - pa->y)*(pc->z - pa->z) - (pb->z - pa->z)*(pc->y - pa->y);
- n.y = (pb->z - pa->z)*(pc->x - pa->x) - (pb->x - pa->x)*(pc->z - pa->z);
- n.z = (pb->x - pa->x)*(pc->y - pa->y) - (pb->y - pa->y)*(pc->x - pa->x);
- Normalise(&n);
- d = - n.x * pa->x - n.y * pa->y - n.z * pa->z;
-
-
- //Calculate the position on the line that intersects the plane
- denom = n.x * (p2->x - p1->x) + n.y * (p2->y - p1->y) + n.z * (p2->z - p1->z);
- if (fabs(denom) < 0.0000001) // Line and plane don't intersect
- return 0;
- mu = - (d + n.x * p1->x + n.y * p1->y + n.z * p1->z) / denom;
- p->x = p1->x + mu * (p2->x - p1->x);
- p->y = p1->y + mu * (p2->y - p1->y);
- p->z = p1->z + mu * (p2->z - p1->z);
- if (mu < 0 || mu > 1) // Intersection not along line segment
- return 0;
-
- if(!PointInTriangle( p, n, pa, pb, pc)){return 0;}
- return 1;
+ static float d;
+ static float a1, a2, a3;
+ static float total, denom, mu;
+ static XYZ pa1, pa2, pa3, n;
+
+ //Calculate the parameters for the plane
+ n.x = (pb->y - pa->y) * (pc->z - pa->z) - (pb->z - pa->z) * (pc->y - pa->y);
+ n.y = (pb->z - pa->z) * (pc->x - pa->x) - (pb->x - pa->x) * (pc->z - pa->z);
+ n.z = (pb->x - pa->x) * (pc->y - pa->y) - (pb->y - pa->y) * (pc->x - pa->x);
+ Normalise(&n);
+ d = - n.x * pa->x - n.y * pa->y - n.z * pa->z;
+
+
+ //Calculate the position on the line that intersects the plane
+ denom = n.x * (p2->x - p1->x) + n.y * (p2->y - p1->y) + n.z * (p2->z - p1->z);
+ if (fabs(denom) < 0.0000001) // Line and plane don't intersect
+ return 0;
+ mu = - (d + n.x * p1->x + n.y * p1->y + n.z * p1->z) / denom;
+ p->x = p1->x + mu * (p2->x - p1->x);
+ p->y = p1->y + mu * (p2->y - p1->y);
+ p->z = p1->z + mu * (p2->z - p1->z);
+ if (mu < 0 || mu > 1) // Intersection not along line segment
+ return 0;
+
+ if (!PointInTriangle( p, n, pa, pb, pc)) {
+ return 0;
+ }
+ return 1;
}
-float LineFacetd(XYZ *p1,XYZ *p2,XYZ *pa,XYZ *pb,XYZ *pc, XYZ *n, XYZ *p)
+float LineFacetd(XYZ *p1, XYZ *p2, XYZ *pa, XYZ *pb, XYZ *pc, XYZ *n, XYZ *p)
{
- static float d;
- static float a1,a2,a3;
- static float total,denom,mu;
- static XYZ pa1,pa2,pa3;
-
- //Calculate the parameters for the plane
- d = - n->x * pa->x - n->y * pa->y - n->z * pa->z;
-
- //Calculate the position on the line that intersects the plane
- denom = n->x * (p2->x - p1->x) + n->y * (p2->y - p1->y) + n->z * (p2->z - p1->z);
- if (fabs(denom) < 0.0000001) // Line and plane don't intersect
- return 0;
- mu = - (d + n->x * p1->x + n->y * p1->y + n->z * p1->z) / denom;
- p->x = p1->x + mu * (p2->x - p1->x);
- p->y = p1->y + mu * (p2->y - p1->y);
- p->z = p1->z + mu * (p2->z - p1->z);
- if (mu < 0 || mu > 1) // Intersection not along line segment
- return 0;
-
- if(!PointInTriangle( p, *n, pa, pb, pc)){return 0;}
- return 1;
+ static float d;
+ static float a1, a2, a3;
+ static float total, denom, mu;
+ static XYZ pa1, pa2, pa3;
+
+ //Calculate the parameters for the plane
+ d = - n->x * pa->x - n->y * pa->y - n->z * pa->z;
+
+ //Calculate the position on the line that intersects the plane
+ denom = n->x * (p2->x - p1->x) + n->y * (p2->y - p1->y) + n->z * (p2->z - p1->z);
+ if (fabs(denom) < 0.0000001) // Line and plane don't intersect
+ return 0;
+ mu = - (d + n->x * p1->x + n->y * p1->y + n->z * p1->z) / denom;
+ p->x = p1->x + mu * (p2->x - p1->x);
+ p->y = p1->y + mu * (p2->y - p1->y);
+ p->z = p1->z + mu * (p2->z - p1->z);
+ if (mu < 0 || mu > 1) // Intersection not along line segment
+ return 0;
+
+ if (!PointInTriangle( p, *n, pa, pb, pc)) {
+ return 0;
+ }
+ return 1;
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
//using namespace std;
typedef float Matrix_t [4][4];
-struct euler
-{
- float x, y, z;
+struct euler {
+ float x, y, z;
};
-struct angle_axis
-{
- float x, y, z, angle;
+struct angle_axis {
+ float x, y, z, angle;
};
-struct quaternion
-{
- float x, y, z, w;
+struct quaternion {
+ float x, y, z, w;
};
-class XYZ{
+class XYZ
+{
public:
- float x;
- float y;
- float z;
+ float x;
+ float y;
+ float z;
XYZ() : x(0.0f), y(0.0f), z(0.0f) {}
- inline XYZ operator+(XYZ add);
- inline XYZ operator-(XYZ add);
- inline XYZ operator*(float add);
- inline XYZ operator*(XYZ add);
- inline XYZ operator/(float add);
- inline void operator+=(XYZ add);
- inline void operator-=(XYZ add);
- inline void operator*=(float add);
- inline void operator*=(XYZ add);
- inline void operator/=(float add);
- inline void operator=(float add);
- inline void vec(Vector add);
- inline bool operator==(XYZ add);
+ inline XYZ operator+(XYZ add);
+ inline XYZ operator-(XYZ add);
+ inline XYZ operator*(float add);
+ inline XYZ operator*(XYZ add);
+ inline XYZ operator/(float add);
+ inline void operator+=(XYZ add);
+ inline void operator-=(XYZ add);
+ inline void operator*=(float add);
+ inline void operator*=(XYZ add);
+ inline void operator/=(float add);
+ inline void operator=(float add);
+ inline void vec(Vector add);
+ inline bool operator==(XYZ add);
};
/*********************> Quaternion Function definition <********/
inline float normaldotproduct(XYZ point1, XYZ point2);
inline float fast_sqrt (register float arg);
bool PointInTriangle(XYZ *p, XYZ normal, XYZ *p1, XYZ *p2, XYZ *p3);
-bool LineFacet(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ *p);
-float LineFacetd(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ *p);
-float LineFacetd(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ n, XYZ *p);
-float LineFacetd(XYZ *p1,XYZ *p2,XYZ *pa,XYZ *pb,XYZ *pc,XYZ *n, XYZ *p);
-float LineFacetd(XYZ *p1,XYZ *p2,XYZ *pa,XYZ *pb,XYZ *pc, XYZ *p);
+bool LineFacet(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ *p);
+float LineFacetd(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ *p);
+float LineFacetd(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ n, XYZ *p);
+float LineFacetd(XYZ *p1, XYZ *p2, XYZ *pa, XYZ *pb, XYZ *pc, XYZ *n, XYZ *p);
+float LineFacetd(XYZ *p1, XYZ *p2, XYZ *pa, XYZ *pb, XYZ *pc, XYZ *p);
bool PointInTriangle(Vector *p, Vector normal, float p11, float p12, float p13, float p21, float p22, float p23, float p31, float p32, float p33);
-bool LineFacet(Vector p1,Vector p2,Vector pa,Vector pb,Vector pc,Vector *p);
+bool LineFacet(Vector p1, Vector p2, Vector pa, Vector pb, Vector pc, Vector *p);
inline void ReflectVector(XYZ *vel, const XYZ *n);
inline void ReflectVector(XYZ *vel, const XYZ &n);
inline XYZ DoRotation(XYZ thePoint, float xang, float yang, float zang);
inline float distsqflat(XYZ *point1, XYZ *point2);
inline float dotproduct(const XYZ *point1, const XYZ *point2);
bool sphere_line_intersection (
- float x1, float y1 , float z1,
- float x2, float y2 , float z2,
- float x3, float y3 , float z3, float r );
+ float x1, float y1 , float z1,
+ float x2, float y2 , float z2,
+ float x3, float y3 , float z3, float r );
bool sphere_line_intersection (
- XYZ *p1, XYZ *p2, XYZ *p3, float *r );
+ XYZ *p1, XYZ *p2, XYZ *p3, float *r );
inline bool DistancePointLine( XYZ *Point, XYZ *LineStart, XYZ *LineEnd, float *Distance, XYZ *Intersection );
-inline void Normalise(XYZ *vectory) {
- static float d;
- d = fast_sqrt(vectory->x*vectory->x+vectory->y*vectory->y+vectory->z*vectory->z);
- if(d==0){return;}
- vectory->x /= d;
- vectory->y /= d;
- vectory->z /= d;
+inline void Normalise(XYZ *vectory)
+{
+ static float d;
+ d = fast_sqrt(vectory->x * vectory->x + vectory->y * vectory->y + vectory->z * vectory->z);
+ if (d == 0) {
+ return;
+ }
+ vectory->x /= d;
+ vectory->y /= d;
+ vectory->z /= d;
}
-inline XYZ XYZ::operator+(XYZ add){
- static XYZ ne;
- ne=add;
- ne.x+=x;
- ne.y+=y;
- ne.z+=z;
- return ne;
+inline XYZ XYZ::operator+(XYZ add)
+{
+ static XYZ ne;
+ ne = add;
+ ne.x += x;
+ ne.y += y;
+ ne.z += z;
+ return ne;
}
-inline XYZ XYZ::operator-(XYZ add){
- static XYZ ne;
- ne=add;
- ne.x=x-ne.x;
- ne.y=y-ne.y;
- ne.z=z-ne.z;
- return ne;
+inline XYZ XYZ::operator-(XYZ add)
+{
+ static XYZ ne;
+ ne = add;
+ ne.x = x - ne.x;
+ ne.y = y - ne.y;
+ ne.z = z - ne.z;
+ return ne;
}
-inline XYZ XYZ::operator*(float add){
- static XYZ ne;
- ne.x=x*add;
- ne.y=y*add;
- ne.z=z*add;
- return ne;
+inline XYZ XYZ::operator*(float add)
+{
+ static XYZ ne;
+ ne.x = x * add;
+ ne.y = y * add;
+ ne.z = z * add;
+ return ne;
}
-inline XYZ XYZ::operator*(XYZ add){
- static XYZ ne;
- ne.x=x*add.x;
- ne.y=y*add.y;
- ne.z=z*add.z;
- return ne;
+inline XYZ XYZ::operator*(XYZ add)
+{
+ static XYZ ne;
+ ne.x = x * add.x;
+ ne.y = y * add.y;
+ ne.z = z * add.z;
+ return ne;
}
-inline XYZ XYZ::operator/(float add){
- static XYZ ne;
- ne.x=x/add;
- ne.y=y/add;
- ne.z=z/add;
- return ne;
+inline XYZ XYZ::operator/(float add)
+{
+ static XYZ ne;
+ ne.x = x / add;
+ ne.y = y / add;
+ ne.z = z / add;
+ return ne;
}
-inline void XYZ::operator+=(XYZ add){
- x+=add.x;
- y+=add.y;
- z+=add.z;
+inline void XYZ::operator+=(XYZ add)
+{
+ x += add.x;
+ y += add.y;
+ z += add.z;
}
-inline void XYZ::operator-=(XYZ add){
- x=x-add.x;
- y=y-add.y;
- z=z-add.z;
+inline void XYZ::operator-=(XYZ add)
+{
+ x = x - add.x;
+ y = y - add.y;
+ z = z - add.z;
}
-inline void XYZ::operator*=(float add){
- x=x*add;
- y=y*add;
- z=z*add;
+inline void XYZ::operator*=(float add)
+{
+ x = x * add;
+ y = y * add;
+ z = z * add;
}
-inline void XYZ::operator*=(XYZ add){
- x=x*add.x;
- y=y*add.y;
- z=z*add.z;
+inline void XYZ::operator*=(XYZ add)
+{
+ x = x * add.x;
+ y = y * add.y;
+ z = z * add.z;
}
-inline void XYZ::operator/=(float add){
- x=x/add;
- y=y/add;
- z=z/add;
+inline void XYZ::operator/=(float add)
+{
+ x = x / add;
+ y = y / add;
+ z = z / add;
}
-inline void XYZ::operator=(float add){
- x=add;
- y=add;
- z=add;
+inline void XYZ::operator=(float add)
+{
+ x = add;
+ y = add;
+ z = add;
}
-inline void XYZ::vec(Vector add){
- x=add.x;
- y=add.y;
- z=add.z;
+inline void XYZ::vec(Vector add)
+{
+ x = add.x;
+ y = add.y;
+ z = add.z;
}
-inline bool XYZ::operator==(XYZ add){
- if(x==add.x&&y==add.y&&z==add.z)return 1;
- return 0;
+inline bool XYZ::operator==(XYZ add)
+{
+ if (x == add.x && y == add.y && z == add.z)return 1;
+ return 0;
}
-inline void CrossProduct(XYZ *P, XYZ *Q, XYZ *V){
- V->x = P->y * Q->z - P->z * Q->y;
- V->y = P->z * Q->x - P->x * Q->z;
- V->z = P->x * Q->y - P->y * Q->x;
+inline void CrossProduct(XYZ *P, XYZ *Q, XYZ *V)
+{
+ V->x = P->y * Q->z - P->z * Q->y;
+ V->y = P->z * Q->x - P->x * Q->z;
+ V->z = P->x * Q->y - P->y * Q->x;
}
-inline void CrossProduct(XYZ P, XYZ Q, XYZ *V){
- V->x = P.y * Q.z - P.z * Q.y;
- V->y = P.z * Q.x - P.x * Q.z;
- V->z = P.x * Q.y - P.y * Q.x;
+inline void CrossProduct(XYZ P, XYZ Q, XYZ *V)
+{
+ V->x = P.y * Q.z - P.z * Q.y;
+ V->y = P.z * Q.x - P.x * Q.z;
+ V->z = P.x * Q.y - P.y * Q.x;
}
inline float fast_sqrt (register float arg)
-{
+{
#if PLATFORM_MACOSX
- // Can replace with slower return std::sqrt(arg);
- register float result;
+ // Can replace with slower return std::sqrt(arg);
+ register float result;
- if (arg == 0.0) return 0.0;
+ if (arg == 0.0) return 0.0;
- asm {
- frsqrte result,arg // Calculate Square root
- }
+ asm {
+ frsqrte result, arg // Calculate Square root
+ }
- // Newton Rhapson iterations.
- result = result + 0.5 * result * (1.0 - arg * result * result);
- result = result + 0.5 * result * (1.0 - arg * result * result);
+ // Newton Rhapson iterations.
+ result = result + 0.5 * result * (1.0 - arg * result * result);
+ result = result + 0.5 * result * (1.0 - arg * result * result);
- return result * arg;
+ return result * arg;
#else
- return sqrtf( arg);
+ return sqrtf( arg);
#endif
}
-inline float normaldotproduct(XYZ point1, XYZ point2){
- static GLfloat returnvalue;
- Normalise(&point1);
- Normalise(&point2);
- returnvalue=(point1.x*point2.x+point1.y*point2.y+point1.z*point2.z);
- return returnvalue;
+inline float normaldotproduct(XYZ point1, XYZ point2)
+{
+ static GLfloat returnvalue;
+ Normalise(&point1);
+ Normalise(&point2);
+ returnvalue = (point1.x * point2.x + point1.y * point2.y + point1.z * point2.z);
+ return returnvalue;
}
inline void ReflectVector(XYZ *vel, const XYZ *n)
inline void ReflectVector(XYZ *vel, const XYZ &n)
{
- static XYZ vn;
- static XYZ vt;
- static float dotprod;
+ static XYZ vn;
+ static XYZ vt;
+ static float dotprod;
- dotprod=dotproduct(&n,vel);
- vn.x=n.x*dotprod;
- vn.y=n.y*dotprod;
- vn.z=n.z*dotprod;
+ dotprod = dotproduct(&n, vel);
+ vn.x = n.x * dotprod;
+ vn.y = n.y * dotprod;
+ vn.z = n.z * dotprod;
- vt.x=vel->x-vn.x;
- vt.y=vel->y-vn.y;
- vt.z=vel->z-vn.z;
+ vt.x = vel->x - vn.x;
+ vt.y = vel->y - vn.y;
+ vt.z = vel->z - vn.z;
- vel->x = vt.x - vn.x;
- vel->y = vt.y - vn.y;
- vel->z = vt.z - vn.z;
+ vel->x = vt.x - vn.x;
+ vel->y = vt.y - vn.y;
+ vel->z = vt.z - vn.z;
}
-inline float dotproduct(const XYZ *point1, const XYZ *point2){
- static GLfloat returnvalue;
- returnvalue=(point1->x*point2->x+point1->y*point2->y+point1->z*point2->z);
- return returnvalue;
+inline float dotproduct(const XYZ *point1, const XYZ *point2)
+{
+ static GLfloat returnvalue;
+ returnvalue = (point1->x * point2->x + point1->y * point2->y + point1->z * point2->z);
+ return returnvalue;
}
-inline float findDistance(XYZ *point1, XYZ *point2){
- return(fast_sqrt((point1->x-point2->x)*(point1->x-point2->x)+(point1->y-point2->y)*(point1->y-point2->y)+(point1->z-point2->z)*(point1->z-point2->z)));
+inline float findDistance(XYZ *point1, XYZ *point2)
+{
+ return(fast_sqrt((point1->x - point2->x) * (point1->x - point2->x) + (point1->y - point2->y) * (point1->y - point2->y) + (point1->z - point2->z) * (point1->z - point2->z)));
}
-inline float findLength(XYZ *point1){
- return(fast_sqrt((point1->x)*(point1->x)+(point1->y)*(point1->y)+(point1->z)*(point1->z)));
+inline float findLength(XYZ *point1)
+{
+ return(fast_sqrt((point1->x) * (point1->x) + (point1->y) * (point1->y) + (point1->z) * (point1->z)));
}
-inline float findLengthfast(XYZ *point1){
- return((point1->x)*(point1->x)+(point1->y)*(point1->y)+(point1->z)*(point1->z));
+inline float findLengthfast(XYZ *point1)
+{
+ return((point1->x) * (point1->x) + (point1->y) * (point1->y) + (point1->z) * (point1->z));
}
-inline float distsq(XYZ *point1, XYZ *point2){
- return((point1->x-point2->x)*(point1->x-point2->x)+(point1->y-point2->y)*(point1->y-point2->y)+(point1->z-point2->z)*(point1->z-point2->z));
+inline float distsq(XYZ *point1, XYZ *point2)
+{
+ return((point1->x - point2->x) * (point1->x - point2->x) + (point1->y - point2->y) * (point1->y - point2->y) + (point1->z - point2->z) * (point1->z - point2->z));
}
-inline float distsq(XYZ point1, XYZ point2){
- return((point1.x-point2.x)*(point1.x-point2.x)+(point1.y-point2.y)*(point1.y-point2.y)+(point1.z-point2.z)*(point1.z-point2.z));
+inline float distsq(XYZ point1, XYZ point2)
+{
+ return((point1.x - point2.x) * (point1.x - point2.x) + (point1.y - point2.y) * (point1.y - point2.y) + (point1.z - point2.z) * (point1.z - point2.z));
}
-inline float distsqflat(XYZ *point1, XYZ *point2){
- return((point1->x-point2->x)*(point1->x-point2->x)+(point1->z-point2->z)*(point1->z-point2->z));
+inline float distsqflat(XYZ *point1, XYZ *point2)
+{
+ return((point1->x - point2->x) * (point1->x - point2->x) + (point1->z - point2->z) * (point1->z - point2->z));
}
-inline XYZ DoRotation(XYZ thePoint, float xang, float yang, float zang){
- static XYZ newpoint;
- if(xang){
- xang*=6.283185f;
- xang/=360;
- }
- if(yang){
- yang*=6.283185f;
- yang/=360;
- }
- if(zang){
- zang*=6.283185f;
- zang/=360;
- }
+inline XYZ DoRotation(XYZ thePoint, float xang, float yang, float zang)
+{
+ static XYZ newpoint;
+ if (xang) {
+ xang *= 6.283185f;
+ xang /= 360;
+ }
+ if (yang) {
+ yang *= 6.283185f;
+ yang /= 360;
+ }
+ if (zang) {
+ zang *= 6.283185f;
+ zang /= 360;
+ }
+
+
+ if (yang) {
+ newpoint.z = thePoint.z * cosf(yang) - thePoint.x * sinf(yang);
+ newpoint.x = thePoint.z * sinf(yang) + thePoint.x * cosf(yang);
+ thePoint.z = newpoint.z;
+ thePoint.x = newpoint.x;
+ }
+
+ if (zang) {
+ newpoint.x = thePoint.x * cosf(zang) - thePoint.y * sinf(zang);
+ newpoint.y = thePoint.y * cosf(zang) + thePoint.x * sinf(zang);
+ thePoint.x = newpoint.x;
+ thePoint.y = newpoint.y;
+ }
+
+ if (xang) {
+ newpoint.y = thePoint.y * cosf(xang) - thePoint.z * sinf(xang);
+ newpoint.z = thePoint.y * sinf(xang) + thePoint.z * cosf(xang);
+ thePoint.z = newpoint.z;
+ thePoint.y = newpoint.y;
+ }
+
+ return thePoint;
+}
+
+inline float square( float f )
+{
+ return (f * f) ;
+}
+inline bool sphere_line_intersection (
+ float x1, float y1 , float z1,
+ float x2, float y2 , float z2,
+ float x3, float y3 , float z3, float r )
+{
+
+ // x1,y1,z1 P1 coordinates (point of line)
+ // x2,y2,z2 P2 coordinates (point of line)
+ // x3,y3,z3, r P3 coordinates and radius (sphere)
+ // x,y,z intersection coordinates
+ //
+ // This function returns a pointer array which first index indicates
+ // the number of intersection point, followed by coordinate pairs.
+
+ //~ static float x , y , z;
+ static float a, b, c, /*mu,*/ i ;
+
+ if (x1 > x3 + r && x2 > x3 + r)return(0);
+ if (x1 < x3 - r && x2 < x3 - r)return(0);
+ if (y1 > y3 + r && y2 > y3 + r)return(0);
+ if (y1 < y3 - r && y2 < y3 - r)return(0);
+ if (z1 > z3 + r && z2 > z3 + r)return(0);
+ if (z1 < z3 - r && z2 < z3 - r)return(0);
+ a = square(x2 - x1) + square(y2 - y1) + square(z2 - z1);
+ b = 2 * ( (x2 - x1) * (x1 - x3)
+ + (y2 - y1) * (y1 - y3)
+ + (z2 - z1) * (z1 - z3) ) ;
+ c = square(x3) + square(y3) +
+ square(z3) + square(x1) +
+ square(y1) + square(z1) -
+ 2 * ( x3 * x1 + y3 * y1 + z3 * z1 ) - square(r) ;
+ i = b * b - 4 * a * c ;
+
+ if ( i < 0.0 ) {
+ // no intersection
+ return(0);
+ }
+ return(1);
+}
- if(yang){
- newpoint.z=thePoint.z*cosf(yang)-thePoint.x*sinf(yang);
- newpoint.x=thePoint.z*sinf(yang)+thePoint.x*cosf(yang);
- thePoint.z=newpoint.z;
- thePoint.x=newpoint.x;
- }
+inline bool sphere_line_intersection (
+ XYZ *p1, XYZ *p2, XYZ *p3, float *r )
+{
- if(zang){
- newpoint.x=thePoint.x*cosf(zang)-thePoint.y*sinf(zang);
- newpoint.y=thePoint.y*cosf(zang)+thePoint.x*sinf(zang);
- thePoint.x=newpoint.x;
- thePoint.y=newpoint.y;
- }
+ // x1,p1->y,p1->z P1 coordinates (point of line)
+ // p2->x,p2->y,p2->z P2 coordinates (point of line)
+ // p3->x,p3->y,p3->z, r P3 coordinates and radius (sphere)
+ // x,y,z intersection coordinates
+ //
+ // This function returns a pointer array which first index indicates
+ // the number of intersection point, followed by coordinate pairs.
+
+ //~ static float x , y , z;
+ static float a, b, c, /*mu,*/ i ;
+
+ if (p1->x > p3->x + *r && p2->x > p3->x + *r)return(0);
+ if (p1->x < p3->x - *r && p2->x < p3->x - *r)return(0);
+ if (p1->y > p3->y + *r && p2->y > p3->y + *r)return(0);
+ if (p1->y < p3->y - *r && p2->y < p3->y - *r)return(0);
+ if (p1->z > p3->z + *r && p2->z > p3->z + *r)return(0);
+ if (p1->z < p3->z - *r && p2->z < p3->z - *r)return(0);
+ a = square(p2->x - p1->x) + square(p2->y - p1->y) + square(p2->z - p1->z);
+ b = 2 * ( (p2->x - p1->x) * (p1->x - p3->x)
+ + (p2->y - p1->y) * (p1->y - p3->y)
+ + (p2->z - p1->z) * (p1->z - p3->z) ) ;
+ c = square(p3->x) + square(p3->y) +
+ square(p3->z) + square(p1->x) +
+ square(p1->y) + square(p1->z) -
+ 2 * ( p3->x * p1->x + p3->y * p1->y + p3->z * p1->z ) - square(*r) ;
+ i = b * b - 4 * a * c ;
+
+ if ( i < 0.0 ) {
+ // no intersection
+ return(0);
+ }
+ return(1);
+}
+
+inline XYZ DoRotationRadian(XYZ thePoint, float xang, float yang, float zang)
+{
+ static XYZ newpoint;
+ static XYZ oldpoint;
- if(xang){
- newpoint.y=thePoint.y*cosf(xang)-thePoint.z*sinf(xang);
- newpoint.z=thePoint.y*sinf(xang)+thePoint.z*cosf(xang);
- thePoint.z=newpoint.z;
- thePoint.y=newpoint.y;
- }
+ oldpoint = thePoint;
- return thePoint;
-}
+ if (yang != 0) {
+ newpoint.z = oldpoint.z * cosf(yang) - oldpoint.x * sinf(yang);
+ newpoint.x = oldpoint.z * sinf(yang) + oldpoint.x * cosf(yang);
+ oldpoint.z = newpoint.z;
+ oldpoint.x = newpoint.x;
+ }
-inline float square( float f ) { return (f*f) ;}
+ if (zang != 0) {
+ newpoint.x = oldpoint.x * cosf(zang) - oldpoint.y * sinf(zang);
+ newpoint.y = oldpoint.y * cosf(zang) + oldpoint.x * sinf(zang);
+ oldpoint.x = newpoint.x;
+ oldpoint.y = newpoint.y;
+ }
-inline bool sphere_line_intersection (
- float x1, float y1 , float z1,
- float x2, float y2 , float z2,
- float x3, float y3 , float z3, float r )
-{
-
- // x1,y1,z1 P1 coordinates (point of line)
- // x2,y2,z2 P2 coordinates (point of line)
- // x3,y3,z3, r P3 coordinates and radius (sphere)
- // x,y,z intersection coordinates
- //
- // This function returns a pointer array which first index indicates
- // the number of intersection point, followed by coordinate pairs.
-
- //~ static float x , y , z;
- static float a, b, c, /*mu,*/ i ;
-
- if(x1>x3+r&&x2>x3+r)return(0);
- if(x1<x3-r&&x2<x3-r)return(0);
- if(y1>y3+r&&y2>y3+r)return(0);
- if(y1<y3-r&&y2<y3-r)return(0);
- if(z1>z3+r&&z2>z3+r)return(0);
- if(z1<z3-r&&z2<z3-r)return(0);
- a = square(x2 - x1) + square(y2 - y1) + square(z2 - z1);
- b = 2* ( (x2 - x1)*(x1 - x3)
- + (y2 - y1)*(y1 - y3)
- + (z2 - z1)*(z1 - z3) ) ;
- c = square(x3) + square(y3) +
- square(z3) + square(x1) +
- square(y1) + square(z1) -
- 2* ( x3*x1 + y3*y1 + z3*z1 ) - square(r) ;
- i = b * b - 4 * a * c ;
-
- if ( i < 0.0 )
- {
- // no intersection
- return(0);
- }
- return(1);
-}
+ if (xang != 0) {
+ newpoint.y = oldpoint.y * cosf(xang) - oldpoint.z * sinf(xang);
+ newpoint.z = oldpoint.y * sinf(xang) + oldpoint.z * cosf(xang);
+ oldpoint.z = newpoint.z;
+ oldpoint.y = newpoint.y;
+ }
-inline bool sphere_line_intersection (
- XYZ *p1, XYZ *p2, XYZ *p3, float *r )
-{
-
- // x1,p1->y,p1->z P1 coordinates (point of line)
- // p2->x,p2->y,p2->z P2 coordinates (point of line)
- // p3->x,p3->y,p3->z, r P3 coordinates and radius (sphere)
- // x,y,z intersection coordinates
- //
- // This function returns a pointer array which first index indicates
- // the number of intersection point, followed by coordinate pairs.
-
- //~ static float x , y , z;
- static float a, b, c, /*mu,*/ i ;
-
- if(p1->x>p3->x+*r&&p2->x>p3->x+*r)return(0);
- if(p1->x<p3->x-*r&&p2->x<p3->x-*r)return(0);
- if(p1->y>p3->y+*r&&p2->y>p3->y+*r)return(0);
- if(p1->y<p3->y-*r&&p2->y<p3->y-*r)return(0);
- if(p1->z>p3->z+*r&&p2->z>p3->z+*r)return(0);
- if(p1->z<p3->z-*r&&p2->z<p3->z-*r)return(0);
- a = square(p2->x - p1->x) + square(p2->y - p1->y) + square(p2->z - p1->z);
- b = 2* ( (p2->x - p1->x)*(p1->x - p3->x)
- + (p2->y - p1->y)*(p1->y - p3->y)
- + (p2->z - p1->z)*(p1->z - p3->z) ) ;
- c = square(p3->x) + square(p3->y) +
- square(p3->z) + square(p1->x) +
- square(p1->y) + square(p1->z) -
- 2* ( p3->x*p1->x + p3->y*p1->y + p3->z*p1->z ) - square(*r) ;
- i = b * b - 4 * a * c ;
-
- if ( i < 0.0 )
- {
- // no intersection
- return(0);
- }
- return(1);
-}
-
-inline XYZ DoRotationRadian(XYZ thePoint, float xang, float yang, float zang){
- static XYZ newpoint;
- static XYZ oldpoint;
-
- oldpoint=thePoint;
-
- if(yang!=0){
- newpoint.z=oldpoint.z*cosf(yang)-oldpoint.x*sinf(yang);
- newpoint.x=oldpoint.z*sinf(yang)+oldpoint.x*cosf(yang);
- oldpoint.z=newpoint.z;
- oldpoint.x=newpoint.x;
- }
-
- if(zang!=0){
- newpoint.x=oldpoint.x*cosf(zang)-oldpoint.y*sinf(zang);
- newpoint.y=oldpoint.y*cosf(zang)+oldpoint.x*sinf(zang);
- oldpoint.x=newpoint.x;
- oldpoint.y=newpoint.y;
- }
-
- if(xang!=0){
- newpoint.y=oldpoint.y*cosf(xang)-oldpoint.z*sinf(xang);
- newpoint.z=oldpoint.y*sinf(xang)+oldpoint.z*cosf(xang);
- oldpoint.z=newpoint.z;
- oldpoint.y=newpoint.y;
- }
-
- return oldpoint;
+ return oldpoint;
}
inline bool DistancePointLine( XYZ *Point, XYZ *LineStart, XYZ *LineEnd, float *Distance, XYZ *Intersection )
{
- float LineMag;
- float U;
+ float LineMag;
+ float U;
- LineMag = findDistance( LineEnd, LineStart );
+ LineMag = findDistance( LineEnd, LineStart );
- U = ( ( ( Point->x - LineStart->x ) * ( LineEnd->x - LineStart->x ) ) +
- ( ( Point->y - LineStart->y ) * ( LineEnd->y - LineStart->y ) ) +
- ( ( Point->z - LineStart->z ) * ( LineEnd->z - LineStart->z ) ) ) /
- ( LineMag * LineMag );
+ U = ( ( ( Point->x - LineStart->x ) * ( LineEnd->x - LineStart->x ) ) +
+ ( ( Point->y - LineStart->y ) * ( LineEnd->y - LineStart->y ) ) +
+ ( ( Point->z - LineStart->z ) * ( LineEnd->z - LineStart->z ) ) ) /
+ ( LineMag * LineMag );
- if( U < 0.0f || U > 1.0f )
- return 0; // closest point does not fall within the line segment
+ if ( U < 0.0f || U > 1.0f )
+ return 0; // closest point does not fall within the line segment
- Intersection->x = LineStart->x + U * ( LineEnd->x - LineStart->x );
- Intersection->y = LineStart->y + U * ( LineEnd->y - LineStart->y );
- Intersection->z = LineStart->z + U * ( LineEnd->z - LineStart->z );
+ Intersection->x = LineStart->x + U * ( LineEnd->x - LineStart->x );
+ Intersection->y = LineStart->y + U * ( LineEnd->y - LineStart->y );
+ Intersection->z = LineStart->z + U * ( LineEnd->z - LineStart->z );
- *Distance = findDistance( Point, Intersection );
+ *Distance = findDistance( Point, Intersection );
- return 1;
+ return 1;
}
#endif
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
using namespace Game;
-void DefaultSettings() {
- detail=1;
- ismotionblur=0;
- usermousesensitivity=1;
- newscreenwidth=kContextWidth=640;
- newscreenheight=kContextHeight=480;
- kBitsPerPixel = 32;
- floatjump=0;
- autoslomo=1;
- decals=1;
- invertmouse=0;
- bloodtoggle=0;
- foliage=1;
- musictoggle=1;
- trilinear=1;
- gamespeed=1;
- difficulty=1;
- damageeffects=0;
- texttoggle=1;
- alwaysblur=0;
- showpoints=0;
- showdamagebar=0;
- immediate=0;
- velocityblur=0;
- volume = 0.8f;
- ambientsound=1;
- vblsync=1;
- debugmode=0;
-
- crouchkey=SDLK_LSHIFT;
- jumpkey=SDLK_SPACE;
- leftkey=SDLK_a;
- forwardkey=SDLK_w;
- backkey=SDLK_s;
- rightkey=SDLK_d;
- drawkey=SDLK_e;
- throwkey=SDLK_q;
- attackkey=MOUSEBUTTON1;
- consolekey=SDLK_BACKQUOTE;
- chatkey=SDLK_t;
+void DefaultSettings()
+{
+ detail = 1;
+ ismotionblur = 0;
+ usermousesensitivity = 1;
+ newscreenwidth = kContextWidth = 640;
+ newscreenheight = kContextHeight = 480;
+ kBitsPerPixel = 32;
+ floatjump = 0;
+ autoslomo = 1;
+ decals = 1;
+ invertmouse = 0;
+ bloodtoggle = 0;
+ foliage = 1;
+ musictoggle = 1;
+ trilinear = 1;
+ gamespeed = 1;
+ difficulty = 1;
+ damageeffects = 0;
+ texttoggle = 1;
+ alwaysblur = 0;
+ showpoints = 0;
+ showdamagebar = 0;
+ immediate = 0;
+ velocityblur = 0;
+ volume = 0.8f;
+ ambientsound = 1;
+ vblsync = 1;
+ debugmode = 0;
+
+ crouchkey = SDLK_LSHIFT;
+ jumpkey = SDLK_SPACE;
+ leftkey = SDLK_a;
+ forwardkey = SDLK_w;
+ backkey = SDLK_s;
+ rightkey = SDLK_d;
+ drawkey = SDLK_e;
+ throwkey = SDLK_q;
+ attackkey = MOUSEBUTTON1;
+ consolekey = SDLK_BACKQUOTE;
+ chatkey = SDLK_t;
}
-void SaveSettings() {
- if(newdetail<0) newdetail=0;
- if(newdetail>2) newdetail=2;
- if(newscreenwidth>3000) newscreenwidth=screenwidth;
- if(newscreenwidth<0) newscreenwidth=screenwidth;
- if(newscreenheight>3000) newscreenheight=screenheight;
- if(newscreenheight<0) newscreenheight=screenheight;
- ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
- opstream << "Screenwidth:\n";
- opstream << newscreenwidth;
- opstream << "\nScreenheight:\n";
- opstream << newscreenheight;
- opstream << "\nMouse sensitivity:\n";
- opstream << usermousesensitivity;
- opstream << "\nBlur(0,1):\n";
- opstream << ismotionblur;
- opstream << "\nOverall Detail(0,1,2) higher=better:\n";
- opstream << newdetail;
- opstream << "\nFloating jump:\n";
- opstream << floatjump;
- opstream << "\nMouse jump:\n";
- opstream << mousejump;
- opstream << "\nAmbient sound:\n";
- opstream << ambientsound;
- opstream << "\nBlood (0,1,2):\n";
- opstream << bloodtoggle;
- opstream << "\nAuto slomo:\n";
- opstream << autoslomo;
- opstream << "\nFoliage:\n";
- opstream << foliage;
- opstream << "\nMusic:\n";
- opstream << musictoggle;
- opstream << "\nTrilinear:\n";
- opstream << trilinear;
- opstream << "\nDecals(shadows,blood puddles,etc):\n";
- opstream << decals;
- opstream << "\nInvert mouse:\n";
- opstream << invertmouse;
- opstream << "\nGamespeed:\n";
- if(oldgamespeed==0)oldgamespeed=1;
- opstream << oldgamespeed;
- opstream << "\nDifficulty(0,1,2) higher=harder:\n";
- opstream << difficulty;
- opstream << "\nDamage effects(blackout, doublevision):\n";
- opstream << damageeffects;
- opstream << "\nText:\n";
- opstream << texttoggle;
- opstream << "\nDebug:\n";
- opstream << debugmode;
- opstream << "\nVBL Sync:\n";
- opstream << vblsync;
- opstream << "\nShow Points:\n";
- opstream << showpoints;
- opstream << "\nAlways Blur:\n";
- opstream << alwaysblur;
- opstream << "\nImmediate mode (turn on on G5):\n";
- opstream << immediate;
- opstream << "\nVelocity blur:\n";
- opstream << velocityblur;
- opstream << "\nVolume:\n";
- opstream << volume;
- opstream << "\nForward key:\n";
- opstream << Input::keyToChar(forwardkey);
- opstream << "\nBack key:\n";
- opstream << Input::keyToChar(backkey);
- opstream << "\nLeft key:\n";
- opstream << Input::keyToChar(leftkey);
- opstream << "\nRight key:\n";
- opstream << Input::keyToChar(rightkey);
- opstream << "\nJump key:\n";
- opstream << Input::keyToChar(jumpkey);
- opstream << "\nCrouch key:\n";
- opstream << Input::keyToChar(crouchkey);
- opstream << "\nDraw key:\n";
- opstream << Input::keyToChar(drawkey);
- opstream << "\nThrow key:\n";
- opstream << Input::keyToChar(throwkey);
- opstream << "\nAttack key:\n";
- opstream << Input::keyToChar(attackkey);
- opstream << "\nConsole key:\n";
- opstream << Input::keyToChar(consolekey);
- opstream << "\nChat key:\n";
- opstream << Input::keyToChar(chatkey);
- opstream << "\nDamage bar:\n";
- opstream << showdamagebar;
- opstream << "\nStereoMode:\n";
- opstream << stereomode;
- opstream << "\nStereoSeparation:\n";
- opstream << stereoseparation;
- opstream << "\nStereoReverse:\n";
- opstream << stereoreverse;
- opstream.close();
+void SaveSettings()
+{
+ if (newdetail < 0) newdetail = 0;
+ if (newdetail > 2) newdetail = 2;
+ if (newscreenwidth > 3000) newscreenwidth = screenwidth;
+ if (newscreenwidth < 0) newscreenwidth = screenwidth;
+ if (newscreenheight > 3000) newscreenheight = screenheight;
+ if (newscreenheight < 0) newscreenheight = screenheight;
+ ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
+ opstream << "Screenwidth:\n";
+ opstream << newscreenwidth;
+ opstream << "\nScreenheight:\n";
+ opstream << newscreenheight;
+ opstream << "\nMouse sensitivity:\n";
+ opstream << usermousesensitivity;
+ opstream << "\nBlur(0,1):\n";
+ opstream << ismotionblur;
+ opstream << "\nOverall Detail(0,1,2) higher=better:\n";
+ opstream << newdetail;
+ opstream << "\nFloating jump:\n";
+ opstream << floatjump;
+ opstream << "\nMouse jump:\n";
+ opstream << mousejump;
+ opstream << "\nAmbient sound:\n";
+ opstream << ambientsound;
+ opstream << "\nBlood (0,1,2):\n";
+ opstream << bloodtoggle;
+ opstream << "\nAuto slomo:\n";
+ opstream << autoslomo;
+ opstream << "\nFoliage:\n";
+ opstream << foliage;
+ opstream << "\nMusic:\n";
+ opstream << musictoggle;
+ opstream << "\nTrilinear:\n";
+ opstream << trilinear;
+ opstream << "\nDecals(shadows,blood puddles,etc):\n";
+ opstream << decals;
+ opstream << "\nInvert mouse:\n";
+ opstream << invertmouse;
+ opstream << "\nGamespeed:\n";
+ if (oldgamespeed == 0)oldgamespeed = 1;
+ opstream << oldgamespeed;
+ opstream << "\nDifficulty(0,1,2) higher=harder:\n";
+ opstream << difficulty;
+ opstream << "\nDamage effects(blackout, doublevision):\n";
+ opstream << damageeffects;
+ opstream << "\nText:\n";
+ opstream << texttoggle;
+ opstream << "\nDebug:\n";
+ opstream << debugmode;
+ opstream << "\nVBL Sync:\n";
+ opstream << vblsync;
+ opstream << "\nShow Points:\n";
+ opstream << showpoints;
+ opstream << "\nAlways Blur:\n";
+ opstream << alwaysblur;
+ opstream << "\nImmediate mode (turn on on G5):\n";
+ opstream << immediate;
+ opstream << "\nVelocity blur:\n";
+ opstream << velocityblur;
+ opstream << "\nVolume:\n";
+ opstream << volume;
+ opstream << "\nForward key:\n";
+ opstream << Input::keyToChar(forwardkey);
+ opstream << "\nBack key:\n";
+ opstream << Input::keyToChar(backkey);
+ opstream << "\nLeft key:\n";
+ opstream << Input::keyToChar(leftkey);
+ opstream << "\nRight key:\n";
+ opstream << Input::keyToChar(rightkey);
+ opstream << "\nJump key:\n";
+ opstream << Input::keyToChar(jumpkey);
+ opstream << "\nCrouch key:\n";
+ opstream << Input::keyToChar(crouchkey);
+ opstream << "\nDraw key:\n";
+ opstream << Input::keyToChar(drawkey);
+ opstream << "\nThrow key:\n";
+ opstream << Input::keyToChar(throwkey);
+ opstream << "\nAttack key:\n";
+ opstream << Input::keyToChar(attackkey);
+ opstream << "\nConsole key:\n";
+ opstream << Input::keyToChar(consolekey);
+ opstream << "\nChat key:\n";
+ opstream << Input::keyToChar(chatkey);
+ opstream << "\nDamage bar:\n";
+ opstream << showdamagebar;
+ opstream << "\nStereoMode:\n";
+ opstream << stereomode;
+ opstream << "\nStereoSeparation:\n";
+ opstream << stereoseparation;
+ opstream << "\nStereoReverse:\n";
+ opstream << stereoreverse;
+ opstream.close();
}
-bool LoadSettings() {
- ifstream ipstream(ConvertFileName(":Data:config.txt"), std::ios::in);
- if ( !ipstream || ipstream.fail() ) {
- printf("Config file not found\n");
- return false;
- }
- char setting[256];
- char string[256];
-
- printf("Loading config\n");
- while(!ipstream.eof()) {
- ipstream.getline( setting, sizeof(setting) );
-
- // skip blank lines
- // assume lines starting with spaces are all blank
- if ( strlen(setting) == 0 || setting[0] == ' ' || setting[0] == '\t') continue;
- //~ printf("setting : %s\n",setting);
+bool LoadSettings()
+{
+ ifstream ipstream(ConvertFileName(":Data:config.txt"), std::ios::in);
+ if ( !ipstream || ipstream.fail() ) {
+ printf("Config file not found\n");
+ return false;
+ }
+ char setting[256];
+ char string[256];
+
+ printf("Loading config\n");
+ while (!ipstream.eof()) {
+ ipstream.getline( setting, sizeof(setting) );
+
+ // skip blank lines
+ // assume lines starting with spaces are all blank
+ if ( strlen(setting) == 0 || setting[0] == ' ' || setting[0] == '\t') continue;
+ //~ printf("setting : %s\n",setting);
+
+ if ( ipstream.eof() || ipstream.fail() ) {
+ fprintf(stderr, "Error reading config file: Got setting name '%s', but value can't be read\n", setting);
+ ipstream.close();
+ return false;
+ }
+
+
+ if ( !strncmp(setting, "Screenwidth", 11) ) {
+ ipstream >> kContextWidth;
+ } else if ( !strncmp(setting, "Screenheight", 12) ) {
+ ipstream >> kContextHeight;
+ } else if ( !strncmp(setting, "Mouse sensitivity", 17) ) {
+ ipstream >> usermousesensitivity;
+ } else if ( !strncmp(setting, "Blur", 4) ) {
+ ipstream >> ismotionblur;
+ } else if ( !strncmp(setting, "Overall Detail", 14) ) {
+ ipstream >> detail;
+ if (detail != 0)kBitsPerPixel = 32;
+ else kBitsPerPixel = 16;
+ } else if ( !strncmp(setting, "Floating jump", 13) ) {
+ ipstream >> floatjump;
+ } else if ( !strncmp(setting, "Mouse jump", 10) ) {
+ ipstream >> mousejump;
+ } else if ( !strncmp(setting, "Ambient sound", 13) ) {
+ ipstream >> ambientsound;
+ } else if ( !strncmp(setting, "Blood ", 6) ) {
+ ipstream >> bloodtoggle;
+ } else if ( !strncmp(setting, "Auto slomo", 10) ) {
+ ipstream >> autoslomo;
+ } else if ( !strncmp(setting, "Foliage", 7) ) {
+ ipstream >> foliage;
+ } else if ( !strncmp(setting, "Music", 5) ) {
+ ipstream >> musictoggle;
+ } else if ( !strncmp(setting, "Trilinear", 9) ) {
+ ipstream >> trilinear;
+ } else if ( !strncmp(setting, "Decals", 6) ) {
+ ipstream >> decals;
+ } else if ( !strncmp(setting, "Invert mouse", 12) ) {
+ ipstream >> invertmouse;
+ } else if ( !strncmp(setting, "Gamespeed", 9) ) {
+ ipstream >> gamespeed;
+ oldgamespeed = gamespeed;
+ if (oldgamespeed == 0) {
+ gamespeed = 1;
+ oldgamespeed = 1;
+ }
+ } else if ( !strncmp(setting, "Difficulty", 10) ) {
+ ipstream >> difficulty;
+ } else if ( !strncmp(setting, "Damage effects", 14) ) {
+ ipstream >> damageeffects;
+ } else if ( !strncmp(setting, "Text", 4) ) {
+ ipstream >> texttoggle;
+ } else if ( !strncmp(setting, "Debug", 5) ) {
+ ipstream >> debugmode;
+ } else if ( !strncmp(setting, "VBL Sync", 8) ) {
+ ipstream >> vblsync;
+ } else if ( !strncmp(setting, "Show Points", 11) ) {
+ ipstream >> showpoints;
+ } else if ( !strncmp(setting, "Always Blur", 11) ) {
+ ipstream >> alwaysblur;
+ } else if ( !strncmp(setting, "Immediate mode ", 15) ) {
+ ipstream >> immediate;
+ } else if ( !strncmp(setting, "Velocity blur", 13) ) {
+ ipstream >> velocityblur;
+ } else if ( !strncmp(setting, "Volume", 6) ) {
+ ipstream >> volume;
+ } else if ( !strncmp(setting, "Forward key", 11) ) {
+ ipstream.getline( string, sizeof(string) );
+ forwardkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Back key", 8) ) {
+ ipstream.getline( string, sizeof(string) );
+ backkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Left key", 8) ) {
+ ipstream.getline( string, sizeof(string) );
+ leftkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Right key", 9) ) {
+ ipstream.getline( string, sizeof(string) );
+ rightkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Jump key", 8) ) {
+ ipstream.getline( string, sizeof(string) );
+ jumpkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Crouch key", 10) ) {
+ ipstream.getline( string, sizeof(string) );
+ crouchkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Draw key", 8) ) {
+ ipstream.getline( string, sizeof(string) );
+ drawkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Throw key", 9) ) {
+ ipstream.getline( string, sizeof(string) );
+ throwkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Attack key", 10) ) {
+ ipstream.getline( string, sizeof(string) );
+ attackkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Console key", 11) ) {
+ ipstream.getline( string, sizeof(string) );
+ consolekey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Chat key", 8) ) {
+ ipstream.getline( string, sizeof(string) );
+ chatkey = Input::CharToKey(string);
+ } else if ( !strncmp(setting, "Damage bar", 10) ) {
+ ipstream >> showdamagebar;
+ } else if ( !strncmp(setting, "StereoMode", 10) ) {
+ int i;
+ ipstream >> i;
+ stereomode = (StereoMode)i;
+ } else if ( !strncmp(setting, "StereoSeparation", 16) ) {
+ ipstream >> stereoseparation;
+ } else if ( !strncmp(setting, "StereoReverse", 13) ) {
+ ipstream >> stereoreverse;
+ } else {
+ ipstream >> string;
+ fprintf(stderr, "Unknown config option '%s' with value '%s'. Ignoring.\n", setting, string);
+ }
+
+ if ( ipstream.fail() ) {
+ fprintf(stderr, "Error reading config file: EOF reached when trying to read value for setting '%s'.\n", setting);
+ ipstream.close();
+ return false;
+ }
+
+ if ( ipstream.bad() ) {
+ fprintf(stderr, "Error reading config file: Failed to read value for setting '%s'.\n", setting);
+ ipstream.close();
+ return false;
+ }
+ }
+
+ ipstream.close();
+
+ if (detail > 2)detail = 2;
+ if (detail < 0)detail = 0;
+ if (screenwidth < 0)screenwidth = 640;
+ if (screenheight < 0)screenheight = 480;
- if ( ipstream.eof() || ipstream.fail() ) {
- fprintf(stderr, "Error reading config file: Got setting name '%s', but value can't be read\n", setting);
- ipstream.close();
- return false;
- }
-
-
- if ( !strncmp(setting, "Screenwidth", 11) ) {
- ipstream >> kContextWidth;
- } else if ( !strncmp(setting, "Screenheight", 12) ) {
- ipstream >> kContextHeight;
- } else if ( !strncmp(setting, "Mouse sensitivity", 17) ) {
- ipstream >> usermousesensitivity;
- } else if ( !strncmp(setting, "Blur", 4) ) {
- ipstream >> ismotionblur;
- } else if ( !strncmp(setting, "Overall Detail", 14) ) {
- ipstream >> detail;
- if(detail!=0)kBitsPerPixel=32;
- else kBitsPerPixel=16;
- } else if ( !strncmp(setting, "Floating jump", 13) ) {
- ipstream >> floatjump;
- } else if ( !strncmp(setting, "Mouse jump", 10) ) {
- ipstream >> mousejump;
- } else if ( !strncmp(setting, "Ambient sound", 13) ) {
- ipstream >> ambientsound;
- } else if ( !strncmp(setting, "Blood ", 6) ) {
- ipstream >> bloodtoggle;
- } else if ( !strncmp(setting, "Auto slomo", 10) ) {
- ipstream >> autoslomo;
- } else if ( !strncmp(setting, "Foliage", 7) ) {
- ipstream >> foliage;
- } else if ( !strncmp(setting, "Music", 5) ) {
- ipstream >> musictoggle;
- } else if ( !strncmp(setting, "Trilinear", 9) ) {
- ipstream >> trilinear;
- } else if ( !strncmp(setting, "Decals", 6) ) {
- ipstream >> decals;
- } else if ( !strncmp(setting, "Invert mouse", 12) ) {
- ipstream >> invertmouse;
- } else if ( !strncmp(setting, "Gamespeed", 9) ) {
- ipstream >> gamespeed;
- oldgamespeed=gamespeed;
- if(oldgamespeed==0){
- gamespeed=1;
- oldgamespeed=1;
- }
- } else if ( !strncmp(setting, "Difficulty", 10) ) {
- ipstream >> difficulty;
- } else if ( !strncmp(setting, "Damage effects", 14) ) {
- ipstream >> damageeffects;
- } else if ( !strncmp(setting, "Text", 4) ) {
- ipstream >> texttoggle;
- } else if ( !strncmp(setting, "Debug", 5) ) {
- ipstream >> debugmode;
- } else if ( !strncmp(setting, "VBL Sync", 8) ) {
- ipstream >> vblsync;
- } else if ( !strncmp(setting, "Show Points", 11) ) {
- ipstream >> showpoints;
- } else if ( !strncmp(setting, "Always Blur", 11) ) {
- ipstream >> alwaysblur;
- } else if ( !strncmp(setting, "Immediate mode ", 15) ) {
- ipstream >> immediate;
- } else if ( !strncmp(setting, "Velocity blur", 13) ) {
- ipstream >> velocityblur;
- } else if ( !strncmp(setting, "Volume", 6) ) {
- ipstream >> volume;
- } else if ( !strncmp(setting, "Forward key", 11) ) {
- ipstream.getline( string, sizeof(string) );
- forwardkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Back key", 8) ) {
- ipstream.getline( string, sizeof(string) );
- backkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Left key", 8) ) {
- ipstream.getline( string, sizeof(string) );
- leftkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Right key", 9) ) {
- ipstream.getline( string, sizeof(string) );
- rightkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Jump key", 8) ) {
- ipstream.getline( string, sizeof(string) );
- jumpkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Crouch key", 10) ) {
- ipstream.getline( string, sizeof(string) );
- crouchkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Draw key", 8) ) {
- ipstream.getline( string, sizeof(string) );
- drawkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Throw key", 9) ) {
- ipstream.getline( string, sizeof(string) );
- throwkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Attack key", 10) ) {
- ipstream.getline( string, sizeof(string) );
- attackkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Console key", 11) ) {
- ipstream.getline( string, sizeof(string) );
- consolekey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Chat key", 8) ) {
- ipstream.getline( string, sizeof(string) );
- chatkey = Input::CharToKey(string);
- } else if ( !strncmp(setting, "Damage bar", 10) ) {
- ipstream >> showdamagebar;
- } else if ( !strncmp(setting, "StereoMode", 10) ) {
- int i;
- ipstream >> i;
- stereomode = (StereoMode)i;
- } else if ( !strncmp(setting, "StereoSeparation", 16) ) {
- ipstream >> stereoseparation;
- } else if ( !strncmp(setting, "StereoReverse", 13) ) {
- ipstream >> stereoreverse;
- } else {
- ipstream >> string;
- fprintf(stderr, "Unknown config option '%s' with value '%s'. Ignoring.\n", setting, string);
- }
-
- if ( ipstream.fail() ) {
- fprintf(stderr, "Error reading config file: EOF reached when trying to read value for setting '%s'.\n", setting);
- ipstream.close();
- return false;
- }
-
- if ( ipstream.bad() ) {
- fprintf(stderr, "Error reading config file: Failed to read value for setting '%s'.\n", setting);
- ipstream.close();
- return false;
- }
- }
-
- ipstream.close();
-
- if(detail>2)detail=2;
- if(detail<0)detail=0;
- if(screenwidth<0)screenwidth=640;
- if(screenheight<0)screenheight=480;
-
- return true;
+ return true;
}
extern int kBitsPerPixel;
extern int kContextWidth;
extern int kContextHeight;
-extern float screenwidth,screenheight;
+extern float screenwidth, screenheight;
void DefaultSettings();
void SaveSettings();
/* convenience functions
*/
-Joint& Skeleton::joint(int bodypart) { return joints[jointlabels[bodypart]]; }
-XYZ& Skeleton::jointPos(int bodypart) { return joint(bodypart).position; }
-XYZ& Skeleton::jointVel(int bodypart) { return joint(bodypart).velocity; }
+Joint& Skeleton::joint(int bodypart)
+{
+ return joints[jointlabels[bodypart]];
+}
+XYZ& Skeleton::jointPos(int bodypart)
+{
+ return joint(bodypart).position;
+}
+XYZ& Skeleton::jointVel(int bodypart)
+{
+ return joint(bodypart).velocity;
+}
/* EFFECT
joints[i].position = joints[i].position + joints[i].velocity * multiplier;
switch (joints[i].label) {
- case head:
- groundlevel = .8; break;
- case righthand:
- case rightwrist:
- case rightelbow:
- case lefthand:
- case leftwrist:
- case leftelbow:
- groundlevel = .2; break;
- default:
- groundlevel = .15; break;
+ case head:
+ groundlevel = .8;
+ break;
+ case righthand:
+ case rightwrist:
+ case rightelbow:
+ case lefthand:
+ case leftwrist:
+ case leftelbow:
+ groundlevel = .2;
+ break;
+ default:
+ groundlevel = .15;
+ break;
}
joints[i].position.y -= groundlevel;
for (i = 0; i < num_joints; i++) {
switch (joints[i].label) {
- case head:
- groundlevel = .8; break;
- case righthand:
- case rightwrist:
- case rightelbow:
- case lefthand:
- case leftwrist:
- case leftelbow:
- groundlevel = .2; break;
- default:
- groundlevel = .15; break;
+ case head:
+ groundlevel = .8;
+ break;
+ case righthand:
+ case rightwrist:
+ case rightelbow:
+ case lefthand:
+ case leftwrist:
+ case leftelbow:
+ groundlevel = .2;
+ break;
+ default:
+ groundlevel = .15;
+ break;
}
joints[i].position.y += groundlevel;
joints[i].mass = 1;
const int label1 = muscles[which].parent1->label;
const int label2 = muscles[which].parent2->label;
switch (label1) {
- case head:
- fwd = specialforward[0]; break;
- case rightshoulder:
- case rightelbow:
- case rightwrist:
- case righthand:
- fwd = specialforward[1]; break;
- case leftshoulder:
- case leftelbow:
- case leftwrist:
- case lefthand:
- fwd = specialforward[2]; break;
- case righthip:
- case rightknee:
- case rightankle:
- case rightfoot:
- fwd = specialforward[3]; break;
- case lefthip:
- case leftknee:
- case leftankle:
- case leftfoot:
- fwd = specialforward[4]; break;
- default:
- if (muscles[which].parent1->lower)
- fwd = lowforward;
- else
- fwd = forward;
- break;
+ case head:
+ fwd = specialforward[0];
+ break;
+ case rightshoulder:
+ case rightelbow:
+ case rightwrist:
+ case righthand:
+ fwd = specialforward[1];
+ break;
+ case leftshoulder:
+ case leftelbow:
+ case leftwrist:
+ case lefthand:
+ fwd = specialforward[2];
+ break;
+ case righthip:
+ case rightknee:
+ case rightankle:
+ case rightfoot:
+ fwd = specialforward[3];
+ break;
+ case lefthip:
+ case leftknee:
+ case leftankle:
+ case leftfoot:
+ fwd = specialforward[4];
+ break;
+ default:
+ if (muscles[which].parent1->lower)
+ fwd = lowforward;
+ else
+ fwd = forward;
+ break;
}
if (animation == hanganim) {
newload = 1;
- // for each muscle...
+ // for each muscle...
for (i = 0; i < num_muscles; i++) {
// read info
tempmuscle = muscles[i].numvertices;
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
void
SkyBox::load (const char *ffront, const char *fleft, const char *fback,
- const char *fright, const char *fup, const char *fdown)
+ const char *fright, const char *fup, const char *fdown)
{
- front.load(ffront, true, false);
- left.load(fleft, true, false);
- back.load(fback, true, false);
- right.load(fright, true, false);
- up.load(fup, true, false);
- down.load(fdown, true, false);
+ front.load(ffront, true, false);
+ left.load(fleft, true, false);
+ back.load(fback, true, false);
+ right.load(fright, true, false);
+ up.load(fup, true, false);
+ down.load(fdown, true, false);
}
void SkyBox::draw()
{
- static float size=viewdistance/4;
- glPushMatrix();
- static GLfloat M[16];
- glGetFloatv(GL_MODELVIEW_MATRIX,M);
- M[12]=0;
- M[13]=0;
- M[14]=0;
- glLoadMatrixf(M);
- if(environment==2)glScalef(1+blurness/1000,1,1+blurness/1000);
- if(environment!=2)glColor3f(.85*skyboxr,.85*skyboxg,.95*skyboxb);
- else glColor3f(1*skyboxr,.95*skyboxg,.95*skyboxb);
+ static float size = viewdistance / 4;
+ glPushMatrix();
+ static GLfloat M[16];
+ glGetFloatv(GL_MODELVIEW_MATRIX, M);
+ M[12] = 0;
+ M[13] = 0;
+ M[14] = 0;
+ glLoadMatrixf(M);
+ if (environment == 2)glScalef(1 + blurness / 1000, 1, 1 + blurness / 1000);
+ if (environment != 2)glColor3f(.85 * skyboxr, .85 * skyboxg, .95 * skyboxb);
+ else glColor3f(1 * skyboxr, .95 * skyboxg, .95 * skyboxb);
- if(!skyboxtexture){
- glDisable(GL_TEXTURE_2D);
- glColor3f(skyboxr*.8,skyboxg*.8,skyboxb*.8);
- }
- glDepthMask(0);
- glDisable(GL_CULL_FACE);
- glEnable(GL_BLEND);
- glDisable(GL_LIGHTING);
- if(skyboxtexture)glEnable(GL_TEXTURE_2D);
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
- front.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glBegin(GL_QUADS);
- glNormal3f( 0.0f, 0.0f, -1);
- glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
- glTexCoord2f(1, 0); glVertex3f( size, -size, size);
- glTexCoord2f(1, 1); glVertex3f( size, size, size);
- glTexCoord2f(0, 1); glVertex3f(-size, size, size);
- glEnd();
- back.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glBegin(GL_QUADS);
- glNormal3f( 0.0f, 0.0f, 1);
- glTexCoord2f(1, 0); glVertex3f(-size, -size, -size);
- glTexCoord2f(1, 1); glVertex3f(-size, size, -size);
- glTexCoord2f(0, 1); glVertex3f( size, size, -size);
- glTexCoord2f(0, 0); glVertex3f( size, -size, -size);
- glEnd();
- up.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glBegin(GL_QUADS);
- glNormal3f( 0.0f, -1.0f, 0);
- glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
- glTexCoord2f(0, 0); glVertex3f(-size, size, size);
- glTexCoord2f(1, 0); glVertex3f( size, size, size);
- glTexCoord2f(1, 1); glVertex3f( size, size, -size);
- glEnd();
- down.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glBegin(GL_QUADS);
- glNormal3f( 0.0f, 1.0f, 0);
+ if (!skyboxtexture) {
+ glDisable(GL_TEXTURE_2D);
+ glColor3f(skyboxr * .8, skyboxg * .8, skyboxb * .8);
+ }
+ glDepthMask(0);
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+ if (skyboxtexture)glEnable(GL_TEXTURE_2D);
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+ front.bind();
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glBegin(GL_QUADS);
+ glNormal3f( 0.0f, 0.0f, -1);
+ glTexCoord2f(0, 0);
+ glVertex3f(-size, -size, size);
+ glTexCoord2f(1, 0);
+ glVertex3f( size, -size, size);
+ glTexCoord2f(1, 1);
+ glVertex3f( size, size, size);
+ glTexCoord2f(0, 1);
+ glVertex3f(-size, size, size);
+ glEnd();
+ back.bind();
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glBegin(GL_QUADS);
+ glNormal3f( 0.0f, 0.0f, 1);
+ glTexCoord2f(1, 0);
+ glVertex3f(-size, -size, -size);
+ glTexCoord2f(1, 1);
+ glVertex3f(-size, size, -size);
+ glTexCoord2f(0, 1);
+ glVertex3f( size, size, -size);
+ glTexCoord2f(0, 0);
+ glVertex3f( size, -size, -size);
+ glEnd();
+ up.bind();
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glBegin(GL_QUADS);
+ glNormal3f( 0.0f, -1.0f, 0);
+ glTexCoord2f(0, 1);
+ glVertex3f(-size, size, -size);
+ glTexCoord2f(0, 0);
+ glVertex3f(-size, size, size);
+ glTexCoord2f(1, 0);
+ glVertex3f( size, size, size);
+ glTexCoord2f(1, 1);
+ glVertex3f( size, size, -size);
+ glEnd();
+ down.bind();
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glBegin(GL_QUADS);
+ glNormal3f( 0.0f, 1.0f, 0);
- glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
- glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
- glTexCoord2f(1, 1); glVertex3f( size, -size, size);
- glTexCoord2f(0, 1); glVertex3f(-size, -size, size);
- glEnd();
- right.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glBegin(GL_QUADS);
- glNormal3f( -1.0f, 0.0f, 0);
- glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
- glTexCoord2f(1, 1); glVertex3f( size, size, -size);
- glTexCoord2f(0, 1); glVertex3f( size, size, size);
- glTexCoord2f(0, 0); glVertex3f( size, -size, size);
- glEnd();
- left.bind();
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
- glBegin(GL_QUADS);
- glNormal3f( 1.0f, 0.0f, 0);
- glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
- glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
- glTexCoord2f(1, 1); glVertex3f(-size, size, size);
- glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
- glEnd();
- glEnable(GL_CULL_FACE);
- glDepthMask(1);
- glPopMatrix();
+ glTexCoord2f(0, 0);
+ glVertex3f(-size, -size, -size);
+ glTexCoord2f(1, 0);
+ glVertex3f( size, -size, -size);
+ glTexCoord2f(1, 1);
+ glVertex3f( size, -size, size);
+ glTexCoord2f(0, 1);
+ glVertex3f(-size, -size, size);
+ glEnd();
+ right.bind();
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glBegin(GL_QUADS);
+ glNormal3f( -1.0f, 0.0f, 0);
+ glTexCoord2f(1, 0);
+ glVertex3f( size, -size, -size);
+ glTexCoord2f(1, 1);
+ glVertex3f( size, size, -size);
+ glTexCoord2f(0, 1);
+ glVertex3f( size, size, size);
+ glTexCoord2f(0, 0);
+ glVertex3f( size, -size, size);
+ glEnd();
+ left.bind();
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glBegin(GL_QUADS);
+ glNormal3f( 1.0f, 0.0f, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-size, -size, -size);
+ glTexCoord2f(1, 0);
+ glVertex3f(-size, -size, size);
+ glTexCoord2f(1, 1);
+ glVertex3f(-size, size, size);
+ glTexCoord2f(0, 1);
+ glVertex3f(-size, size, -size);
+ glEnd();
+ glEnable(GL_CULL_FACE);
+ glDepthMask(1);
+ glPopMatrix();
}
SkyBox::~SkyBox()
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#include "gamegl.h"
#include "Texture.h"
-class SkyBox{
+class SkyBox
+{
public:
- Texture front, left, back, right, up, down;
+ Texture front, left, back, right, up, down;
- void load(const char *ffront, const char *fleft, const char *fback,
- const char *fright, const char *fup, const char *fdown);
- void draw();
+ void load(const char *ffront, const char *fleft, const char *fback,
+ const char *fright, const char *fup, const char *fdown);
+ void draw();
- SkyBox() {}
- ~SkyBox();
+ SkyBox() {}
+ ~SkyBox();
};
#endif
// This should be decided at the time of playback
static int snd_mode(int snd)
{
- switch (snd)
- {
+ switch (snd) {
case alarmsound:
case consolefailsound:
case consolesuccesssound:
case firestartsound:
case fireendsound:
- return OPENAL_2D;
+ return OPENAL_2D;
default:
- return OPENAL_HW3D;
+ return OPENAL_HW3D;
}
}
void loadAllSounds()
{
- for (int i = 0; i < sounds_count; i++)
- {
- char buf[64];
- snprintf(buf, 64, ":Data:Sounds:%s", sound_data[i]);
- samp[i] = OPENAL_Sample_Load(OPENAL_FREE,
- ConvertFileName(buf),
- snd_mode(i),
- 0, 0);
+ for (int i = 0; i < sounds_count; i++) {
+ char buf[64];
+ snprintf(buf, 64, ":Data:Sounds:%s", sound_data[i]);
+ samp[i] = OPENAL_Sample_Load(OPENAL_FREE,
+ ConvertFileName(buf),
+ snd_mode(i),
+ 0, 0);
}
- footstepsound = footstepsn1;
- footstepsound2 = footstepsn2;
- footstepsound3 = footstepst1;
- footstepsound4 = footstepst2;
- // Huh?
- // OPENAL_Sample_SetMode(samp[whooshsound], OPENAL_LOOP_NORMAL);
- for (int i = stream_firesound; i <= stream_menutheme; i++)
- OPENAL_Stream_SetMode(samp[i], OPENAL_LOOP_NORMAL);
+ footstepsound = footstepsn1;
+ footstepsound2 = footstepsn2;
+ footstepsound3 = footstepst1;
+ footstepsound4 = footstepst2;
+ // Huh?
+ // OPENAL_Sample_SetMode(samp[whooshsound], OPENAL_LOOP_NORMAL);
+ for (int i = stream_firesound; i <= stream_menutheme; i++)
+ OPENAL_Stream_SetMode(samp[i], OPENAL_LOOP_NORMAL);
}
void
emit_sound_at(int soundid, const XYZ &pos, float vol)
{
- PlaySoundEx (soundid, samp[soundid], NULL, true);
- OPENAL_3D_SetAttributes_ (channels[soundid], pos, NULL);
- OPENAL_SetVolume (channels[soundid], vol);
- OPENAL_SetPaused (channels[soundid], false);
+ PlaySoundEx (soundid, samp[soundid], NULL, true);
+ OPENAL_3D_SetAttributes_ (channels[soundid], pos, NULL);
+ OPENAL_SetVolume (channels[soundid], vol);
+ OPENAL_SetPaused (channels[soundid], false);
}
void
emit_sound_np(int soundid, float vol)
{
- PlaySoundEx (soundid, samp[soundid], NULL, true);
- OPENAL_SetVolume (channels[soundid], vol);
- OPENAL_SetPaused (channels[soundid], false);
+ PlaySoundEx (soundid, samp[soundid], NULL, true);
+ OPENAL_SetVolume (channels[soundid], vol);
+ OPENAL_SetPaused (channels[soundid], false);
}
void
emit_stream_at(int soundid, const XYZ &pos, float vol)
{
- PlayStreamEx (soundid, samp[soundid], NULL, true);
- OPENAL_3D_SetAttributes_ (channels[soundid], pos, NULL);
- OPENAL_SetVolume (channels[soundid], vol);
- OPENAL_SetPaused (channels[soundid], false);
+ PlayStreamEx (soundid, samp[soundid], NULL, true);
+ OPENAL_3D_SetAttributes_ (channels[soundid], pos, NULL);
+ OPENAL_SetVolume (channels[soundid], vol);
+ OPENAL_SetPaused (channels[soundid], false);
}
void
emit_stream_np(int soundid, float vol)
{
- PlayStreamEx (soundid, samp[soundid], NULL, true);
- OPENAL_SetVolume (channels[soundid], vol);
- OPENAL_SetPaused (channels[soundid], false);
+ PlayStreamEx (soundid, samp[soundid], NULL, true);
+ OPENAL_SetVolume (channels[soundid], vol);
+ OPENAL_SetPaused (channels[soundid], false);
}
void
resume_stream(int soundid)
{
- OPENAL_SetPaused (channels[soundid], false);
+ OPENAL_SetPaused (channels[soundid], false);
}
void
pause_sound(int soundid)
{
- OPENAL_SetPaused (channels[soundid], true);
+ OPENAL_SetPaused (channels[soundid], true);
}
#define DECLARE_SOUND(id, filename) id,
#include "Sounds.def"
#undef DECLARE_SOUND
-sounds_count
+ sounds_count
};
extern struct OPENAL_SAMPLE *samp[sounds_count];
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
//Functions
void Sprite::Draw()
{
- int i,j,k;
- static float M[16];
- static XYZ point;
- static float distancemult;
- static int lasttype;
- static int lastspecial;
- static int whichpatchx,whichpatchz;
- static XYZ start,end,colpoint;
- static bool check;
- static bool blend;
- static float tempmult;
- static XYZ difference;
- static float lightcolor[3];
- static float viewdistsquared=viewdistance*viewdistance;
- static XYZ tempviewer;
+ int i, j, k;
+ static float M[16];
+ static XYZ point;
+ static float distancemult;
+ static int lasttype;
+ static int lastspecial;
+ static int whichpatchx, whichpatchz;
+ static XYZ start, end, colpoint;
+ static bool check;
+ static bool blend;
+ static float tempmult;
+ static XYZ difference;
+ static float lightcolor[3];
+ static float viewdistsquared = viewdistance * viewdistance;
+ static XYZ tempviewer;
- tempviewer=viewer+viewerfacing*6;
- check=0;
+ tempviewer = viewer + viewerfacing * 6;
+ check = 0;
- lightcolor[0]=light.color[0]*.5+light.ambient[0];
- lightcolor[1]=light.color[1]*.5+light.ambient[1];
- lightcolor[2]=light.color[2]*.5+light.ambient[2];
+ lightcolor[0] = light.color[0] * .5 + light.ambient[0];
+ lightcolor[1] = light.color[1] * .5 + light.ambient[1];
+ lightcolor[2] = light.color[2] * .5 + light.ambient[2];
- checkdelay-=multiplier*10;
+ checkdelay -= multiplier * 10;
- if(checkdelay<=0){
- check=1;
- checkdelay=1;
- }
+ if (checkdelay <= 0) {
+ check = 1;
+ checkdelay = 1;
+ }
- lasttype=-1;
- lastspecial=-1;
- glEnable(GL_BLEND);
- glDisable(GL_LIGHTING);
- glDisable(GL_CULL_FACE);
- glEnable(GL_TEXTURE_2D);
- blend = 1;
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glDepthMask(0);
- glAlphaFunc(GL_GREATER, 0.0001);
- for(i=0;i<sprites.size();i++){
- if(lasttype!=sprites[i]->type) {
- switch(sprites[i]->type) {
- case cloudsprite:
- cloudtexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- break;
- case cloudimpactsprite:
- cloudimpacttexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- break;
- case breathsprite:
- cloudimpacttexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- break;
- case smoketype:
- smoketexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- break;
- case bloodsprite:
- bloodtexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- break;
- case splintersprite :
- if(lastspecial!=sprites[i]->special) {
- if(sprites[i]->special==0)splintertexture.bind();
- if(sprites[i]->special==1)leaftexture.bind();
- if(sprites[i]->special==2)snowflaketexture.bind();
- if(sprites[i]->special==3)toothtexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- }
- break;
- case snowsprite:
- snowflaketexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- break;
- case weaponshinesprite:
- shinetexture.bind();
- if(blend){
- blend=0;
- glAlphaFunc(GL_GREATER, 0.001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- }
- break;
- case flamesprite:
- case weaponflamesprite:
- flametexture.bind();
- if(blend||lasttype==bloodflamesprite){
- blend=0;
- glAlphaFunc(GL_GREATER, 0.3);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- }
- break;
- case bloodflamesprite:
- bloodflametexture.bind();
- if(blend){
- blend=0;
- glAlphaFunc(GL_GREATER, 0.3);
- glBlendFunc(GL_ONE,GL_ZERO);
- }
- break;
- }
- }
- if(sprites[i]->type==snowsprite)
- distancemult=(144-(distsq(&tempviewer,&sprites[i]->position)-(144*fadestart))*(1/(1-fadestart)))/144;
- else
- distancemult=(viewdistsquared-(distsq(&viewer,&sprites[i]->position)-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
- if(sprites[i]->type==flamesprite){
- if(distancemult>=1) glColor4f(sprites[i]->color[0],sprites[i]->color[1],sprites[i]->color[2],sprites[i]->opacity);
- else glColor4f(sprites[i]->color[0],sprites[i]->color[1],sprites[i]->color[2],sprites[i]->opacity*distancemult);
- } else {
- if(distancemult>=1) glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->opacity);
- else glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->opacity*distancemult);
- }
- lasttype=sprites[i]->type;
- lastspecial=sprites[i]->special;
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- glTranslatef(sprites[i]->position.x,sprites[i]->position.y,sprites[i]->position.z);
- if((sprites[i]->type==flamesprite||sprites[i]->type==weaponflamesprite||sprites[i]->type==weaponshinesprite)){
- difference=viewer-sprites[i]->position;
- Normalise(&difference);
- glTranslatef(difference.x*sprites[i]->size/4, difference.y*sprites[i]->size/4, difference.z*sprites[i]->size/4);
- }
- if(sprites[i]->type==snowsprite){
- glRotatef(sprites[i]->rotation*.2,0,.3,1);
- glTranslatef(1,0,0);
- }
- glGetFloatv(GL_MODELVIEW_MATRIX,M);
- point.x=M[12];
- point.y=M[13];
- point.z=M[14];
- glLoadIdentity();
- glTranslatef(point.x, point.y, point.z);
+ lasttype = -1;
+ lastspecial = -1;
+ glEnable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+ blend = 1;
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDepthMask(0);
+ glAlphaFunc(GL_GREATER, 0.0001);
+ for (i = 0; i < sprites.size(); i++) {
+ if (lasttype != sprites[i]->type) {
+ switch (sprites[i]->type) {
+ case cloudsprite:
+ cloudtexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ break;
+ case cloudimpactsprite:
+ cloudimpacttexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ break;
+ case breathsprite:
+ cloudimpacttexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ break;
+ case smoketype:
+ smoketexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ break;
+ case bloodsprite:
+ bloodtexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ break;
+ case splintersprite :
+ if (lastspecial != sprites[i]->special) {
+ if (sprites[i]->special == 0)splintertexture.bind();
+ if (sprites[i]->special == 1)leaftexture.bind();
+ if (sprites[i]->special == 2)snowflaketexture.bind();
+ if (sprites[i]->special == 3)toothtexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ }
+ break;
+ case snowsprite:
+ snowflaketexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ break;
+ case weaponshinesprite:
+ shinetexture.bind();
+ if (blend) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ }
+ break;
+ case flamesprite:
+ case weaponflamesprite:
+ flametexture.bind();
+ if (blend || lasttype == bloodflamesprite) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.3);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ }
+ break;
+ case bloodflamesprite:
+ bloodflametexture.bind();
+ if (blend) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.3);
+ glBlendFunc(GL_ONE, GL_ZERO);
+ }
+ break;
+ }
+ }
+ if (sprites[i]->type == snowsprite)
+ distancemult = (144 - (distsq(&tempviewer, &sprites[i]->position) - (144 * fadestart)) * (1 / (1 - fadestart))) / 144;
+ else
+ distancemult = (viewdistsquared - (distsq(&viewer, &sprites[i]->position) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+ if (sprites[i]->type == flamesprite) {
+ if (distancemult >= 1) glColor4f(sprites[i]->color[0], sprites[i]->color[1], sprites[i]->color[2], sprites[i]->opacity);
+ else glColor4f(sprites[i]->color[0], sprites[i]->color[1], sprites[i]->color[2], sprites[i]->opacity * distancemult);
+ } else {
+ if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity);
+ else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * distancemult);
+ }
+ lasttype = sprites[i]->type;
+ lastspecial = sprites[i]->special;
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ glTranslatef(sprites[i]->position.x, sprites[i]->position.y, sprites[i]->position.z);
+ if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite)) {
+ difference = viewer - sprites[i]->position;
+ Normalise(&difference);
+ glTranslatef(difference.x * sprites[i]->size / 4, difference.y * sprites[i]->size / 4, difference.z * sprites[i]->size / 4);
+ }
+ if (sprites[i]->type == snowsprite) {
+ glRotatef(sprites[i]->rotation * .2, 0, .3, 1);
+ glTranslatef(1, 0, 0);
+ }
+ glGetFloatv(GL_MODELVIEW_MATRIX, M);
+ point.x = M[12];
+ point.y = M[13];
+ point.z = M[14];
+ glLoadIdentity();
+ glTranslatef(point.x, point.y, point.z);
- glRotatef(sprites[i]->rotation,0,0,1);
+ glRotatef(sprites[i]->rotation, 0, 0, 1);
- if((sprites[i]->type==flamesprite||sprites[i]->type==weaponflamesprite||sprites[i]->type==weaponshinesprite||sprites[i]->type==bloodflamesprite)){
- if(sprites[i]->alivetime<.14)glScalef(sprites[i]->alivetime/.14,sprites[i]->alivetime/.14,sprites[i]->alivetime/.14);
- }
- if(sprites[i]->type==smoketype||sprites[i]->type==snowsprite||sprites[i]->type==weaponshinesprite||sprites[i]->type==breathsprite){
- if(sprites[i]->alivetime<.3){
- if(distancemult>=1)glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->opacity*sprites[i]->alivetime/.3);
- if(distancemult<1)glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->opacity*distancemult*sprites[i]->alivetime/.3);
- }
- }
- if(sprites[i]->type==splintersprite&&sprites[i]->special>0&&sprites[i]->special!=3){
- if(sprites[i]->alivetime<.2){
- if(distancemult>=1) glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->alivetime/.2);
- else glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],distancemult*sprites[i]->alivetime/.2);
- }
- else {
- if(distancemult>=1) glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],1);
- else glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],1);
- }
- }
- if(sprites[i]->type==splintersprite&&(sprites[i]->special==0||sprites[i]->special==3)){
- if(distancemult>=1) glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],1);
- else glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],1);
- }
+ if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite)) {
+ if (sprites[i]->alivetime < .14)glScalef(sprites[i]->alivetime / .14, sprites[i]->alivetime / .14, sprites[i]->alivetime / .14);
+ }
+ if (sprites[i]->type == smoketype || sprites[i]->type == snowsprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == breathsprite) {
+ if (sprites[i]->alivetime < .3) {
+ if (distancemult >= 1)glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * sprites[i]->alivetime / .3);
+ if (distancemult < 1)glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * distancemult * sprites[i]->alivetime / .3);
+ }
+ }
+ if (sprites[i]->type == splintersprite && sprites[i]->special > 0 && sprites[i]->special != 3) {
+ if (sprites[i]->alivetime < .2) {
+ if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->alivetime / .2);
+ else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], distancemult * sprites[i]->alivetime / .2);
+ } else {
+ if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+ else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+ }
+ }
+ if (sprites[i]->type == splintersprite && (sprites[i]->special == 0 || sprites[i]->special == 3)) {
+ if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+ else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+ }
- glBegin(GL_TRIANGLES);
- glTexCoord2f(1.0f, 1.0f); glVertex3f( .5*sprites[i]->size, .5*sprites[i]->size, 0.0f);
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-.5*sprites[i]->size, .5*sprites[i]->size, 0.0f);
- glTexCoord2f(1.0f, 0.0f); glVertex3f( .5*sprites[i]->size,-.5*sprites[i]->size, 0.0f);
- glTexCoord2f(0.0f, 0.0f); glVertex3f(-.5*sprites[i]->size,-.5*sprites[i]->size, 0.0f);
- glTexCoord2f(1.0f, 0.0f); glVertex3f( .5*sprites[i]->size, -.5*sprites[i]->size, 0.0f);
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-.5*sprites[i]->size, .5*sprites[i]->size, 0.0f);
- glEnd();
- glPopMatrix();
- }
- tempmult=multiplier;
- for(i=sprites.size()-1;i>=0;i--){
- multiplier=tempmult;
- if(sprites[i]->type!=snowsprite) {
- sprites[i]->position+=sprites[i]->velocity*multiplier;
- sprites[i]->velocity+=windvector*multiplier;
- }
- if(sprites[i]->type==flamesprite||sprites[i]->type==smoketype)sprites[i]->position+=windvector*multiplier/2;
- if((sprites[i]->type==flamesprite||sprites[i]->type==weaponflamesprite||sprites[i]->type==weaponshinesprite||sprites[i]->type==bloodflamesprite))
- multiplier*=sprites[i]->speed*.7;
- sprites[i]->alivetime+=multiplier;
+ glBegin(GL_TRIANGLES);
+ glTexCoord2f(1.0f, 1.0f);
+ glVertex3f( .5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f);
+ glTexCoord2f(0.0f, 1.0f);
+ glVertex3f(-.5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f);
+ glTexCoord2f(1.0f, 0.0f);
+ glVertex3f( .5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex3f(-.5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f);
+ glTexCoord2f(1.0f, 0.0f);
+ glVertex3f( .5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f);
+ glTexCoord2f(0.0f, 1.0f);
+ glVertex3f(-.5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f);
+ glEnd();
+ glPopMatrix();
+ }
+ tempmult = multiplier;
+ for (i = sprites.size() - 1; i >= 0; i--) {
+ multiplier = tempmult;
+ if (sprites[i]->type != snowsprite) {
+ sprites[i]->position += sprites[i]->velocity * multiplier;
+ sprites[i]->velocity += windvector * multiplier;
+ }
+ if (sprites[i]->type == flamesprite || sprites[i]->type == smoketype)sprites[i]->position += windvector * multiplier / 2;
+ if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite))
+ multiplier *= sprites[i]->speed * .7;
+ sprites[i]->alivetime += multiplier;
- if(sprites[i]->type==cloudsprite||sprites[i]->type==cloudimpactsprite){
- sprites[i]->opacity-=multiplier/2;
- sprites[i]->size+=multiplier/2;
- sprites[i]->velocity.y+=gravity*multiplier*.25;
- }
- if(sprites[i]->type==breathsprite){
- sprites[i]->opacity-=multiplier/2;
- sprites[i]->size+=multiplier/2;
- if(findLength(&sprites[i]->velocity)<=multiplier)sprites[i]->velocity=0;
- else{
- XYZ slowdown;
- slowdown=sprites[i]->velocity*-1;
- Normalise(&slowdown);
- slowdown*=multiplier;
- sprites[i]->velocity+=slowdown;
- }
- }
- if(sprites[i]->type==snowsprite){
- sprites[i]->size-=multiplier/120;
- sprites[i]->rotation+=multiplier*360;
- sprites[i]->position.y-=multiplier;
- sprites[i]->position+=windvector*multiplier;
- if(sprites[i]->position.y<tempviewer.y-6)sprites[i]->position.y+=12;
- if(sprites[i]->position.y>tempviewer.y+6)sprites[i]->position.y-=12;
- if(sprites[i]->position.z<tempviewer.z-6)sprites[i]->position.z+=12;
- if(sprites[i]->position.z>tempviewer.z+6)sprites[i]->position.z-=12;
- if(sprites[i]->position.x<tempviewer.x-6)sprites[i]->position.x+=12;
- if(sprites[i]->position.x>tempviewer.x+6)sprites[i]->position.x-=12;
- }
- if(sprites[i]->type==bloodsprite){
- bool spritehit=0;
- sprites[i]->rotation+=multiplier*100;
- sprites[i]->velocity.y+=gravity*multiplier;
- if(check){
- XYZ where,startpoint,endpoint,movepoint,footpoint;
- float rotationpoint;
- int whichtri;
+ if (sprites[i]->type == cloudsprite || sprites[i]->type == cloudimpactsprite) {
+ sprites[i]->opacity -= multiplier / 2;
+ sprites[i]->size += multiplier / 2;
+ sprites[i]->velocity.y += gravity * multiplier * .25;
+ }
+ if (sprites[i]->type == breathsprite) {
+ sprites[i]->opacity -= multiplier / 2;
+ sprites[i]->size += multiplier / 2;
+ if (findLength(&sprites[i]->velocity) <= multiplier)sprites[i]->velocity = 0;
+ else {
+ XYZ slowdown;
+ slowdown = sprites[i]->velocity * -1;
+ Normalise(&slowdown);
+ slowdown *= multiplier;
+ sprites[i]->velocity += slowdown;
+ }
+ }
+ if (sprites[i]->type == snowsprite) {
+ sprites[i]->size -= multiplier / 120;
+ sprites[i]->rotation += multiplier * 360;
+ sprites[i]->position.y -= multiplier;
+ sprites[i]->position += windvector * multiplier;
+ if (sprites[i]->position.y < tempviewer.y - 6)sprites[i]->position.y += 12;
+ if (sprites[i]->position.y > tempviewer.y + 6)sprites[i]->position.y -= 12;
+ if (sprites[i]->position.z < tempviewer.z - 6)sprites[i]->position.z += 12;
+ if (sprites[i]->position.z > tempviewer.z + 6)sprites[i]->position.z -= 12;
+ if (sprites[i]->position.x < tempviewer.x - 6)sprites[i]->position.x += 12;
+ if (sprites[i]->position.x > tempviewer.x + 6)sprites[i]->position.x -= 12;
+ }
+ if (sprites[i]->type == bloodsprite) {
+ bool spritehit = 0;
+ sprites[i]->rotation += multiplier * 100;
+ sprites[i]->velocity.y += gravity * multiplier;
+ if (check) {
+ XYZ where, startpoint, endpoint, movepoint, footpoint;
+ float rotationpoint;
+ int whichtri;
- for(j=0;j<numplayers;j++){
- if(!spritehit&&player[j].dead&&sprites[i]->alivetime>.1){
- where=sprites[i]->oldposition;
- where-=player[j].coords;
- if(!player[j].skeleton.free)where=DoRotation(where,0,-player[j].yaw,0);
- startpoint=where;
- where=sprites[i]->position;
- where-=player[j].coords;
- if(!player[j].skeleton.free)where=DoRotation(where,0,-player[j].yaw,0);
- endpoint=where;
+ for (j = 0; j < numplayers; j++) {
+ if (!spritehit && player[j].dead && sprites[i]->alivetime > .1) {
+ where = sprites[i]->oldposition;
+ where -= player[j].coords;
+ if (!player[j].skeleton.free)where = DoRotation(where, 0, -player[j].yaw, 0);
+ startpoint = where;
+ where = sprites[i]->position;
+ where -= player[j].coords;
+ if (!player[j].skeleton.free)where = DoRotation(where, 0, -player[j].yaw, 0);
+ endpoint = where;
- movepoint=0;
- rotationpoint=0;
- whichtri=player[j].skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &footpoint, &movepoint, &rotationpoint);
- if(whichtri!=-1){
- spritehit=1;
- player[j].DoBloodBigWhere(0,160,sprites[i]->oldposition);
- DeleteSprite(i);
- }
- }
- }
+ movepoint = 0;
+ rotationpoint = 0;
+ whichtri = player[j].skeleton.drawmodel.LineCheck(&startpoint, &endpoint, &footpoint, &movepoint, &rotationpoint);
+ if (whichtri != -1) {
+ spritehit = 1;
+ player[j].DoBloodBigWhere(0, 160, sprites[i]->oldposition);
+ DeleteSprite(i);
+ }
+ }
+ }
- whichpatchx=sprites[i]->position.x/(terrain.size/subdivision*terrain.scale);
- whichpatchz=sprites[i]->position.z/(terrain.size/subdivision*terrain.scale);
- if(whichpatchx>0&&whichpatchz>0&&whichpatchx<subdivision&&whichpatchz<subdivision)
- if(terrain.patchobjectnum[whichpatchx][whichpatchz]){
- if(!spritehit)
- for(j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++){
- k=terrain.patchobjects[whichpatchx][whichpatchz][j];
- start=sprites[i]->oldposition;
- end=sprites[i]->position;
- if(!spritehit)
- if(objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k])!=-1){
- if(detail==2||(detail==1&&abs(Random()%4)==0)||(detail==0&&abs(Random()%8)==0))objects.model[k].MakeDecal(blooddecalfast,DoRotation(colpoint-objects.position[k],0,-objects.yaw[k],0),sprites[i]->size*1.6/*+abs((float)(Random()%100))/2400*/,.5,Random()%360);
- DeleteSprite(i);
- spritehit=1;
- }
- }
- }
- if(!spritehit)
- if(sprites[i]->position.y<terrain.getHeight(sprites[i]->position.x,sprites[i]->position.z)){
- terrain.MakeDecal(blooddecalfast,sprites[i]->position,sprites[i]->size*1.6/*+abs((float)(Random()%100))/2400*/,.6,Random()%360);
- DeleteSprite(i);
- }
- }
- }
- if(sprites[i]->type==splintersprite){
- sprites[i]->rotation+=sprites[i]->rotatespeed*multiplier;
- sprites[i]->opacity-=multiplier/2;
- if(sprites[i]->special==0||sprites[i]->special==2||sprites[i]->special==3)sprites[i]->velocity.y+=gravity*multiplier;
- if(sprites[i]->special==1)sprites[i]->velocity.y+=gravity*multiplier*.5;
- }
- if(sprites[i]->type==flamesprite||sprites[i]->type==weaponflamesprite||sprites[i]->type==weaponshinesprite||sprites[i]->type==bloodflamesprite){
- sprites[i]->rotation+=multiplier*sprites[i]->rotatespeed;
- sprites[i]->opacity-=multiplier*5/4;
- if(sprites[i]->type!=weaponshinesprite&&sprites[i]->type!=bloodflamesprite)
- if(sprites[i]->opacity<.5&&sprites[i]->opacity+multiplier*5/4>=.5&&(abs(Random()%4)==0||(sprites[i]->initialsize>2&&Random()%2==0)))
- MakeSprite(smoketype, sprites[i]->position,sprites[i]->velocity, .9,.9,.6, sprites[i]->size*1.2, .4);
- if(sprites[i]->alivetime>.14&&(sprites[i]->type==flamesprite)){
- sprites[i]->velocity=0;
- sprites[i]->velocity.y=1.5;
- }
- }
- if(sprites[i]->type==smoketype){
- sprites[i]->opacity-=multiplier/3/sprites[i]->initialsize;
- sprites[i]->color[0]-=multiplier;
- sprites[i]->color[1]-=multiplier;
- sprites[i]->color[2]-=multiplier;
- if(sprites[i]->color[0]<.6)sprites[i]->color[0]=.6;
- if(sprites[i]->color[1]<.6)sprites[i]->color[1]=.6;
- if(sprites[i]->color[2]<.6)sprites[i]->color[2]=.6;
- sprites[i]->size+=multiplier;
- sprites[i]->velocity=0;
- sprites[i]->velocity.y=1.5;
- sprites[i]->rotation+=multiplier*sprites[i]->rotatespeed/5;
- }
- if(sprites[i]->opacity<=0||sprites[i]->size<=0)DeleteSprite(i);
- }
- if(check)
- for(i=sprites.size()-1;i>=0;i--){
- sprites[i]->oldposition=sprites[i]->position;
- }
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ whichpatchx = sprites[i]->position.x / (terrain.size / subdivision * terrain.scale);
+ whichpatchz = sprites[i]->position.z / (terrain.size / subdivision * terrain.scale);
+ if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision)
+ if (terrain.patchobjectnum[whichpatchx][whichpatchz]) {
+ if (!spritehit)
+ for (j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) {
+ k = terrain.patchobjects[whichpatchx][whichpatchz][j];
+ start = sprites[i]->oldposition;
+ end = sprites[i]->position;
+ if (!spritehit)
+ if (objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]) != -1) {
+ if (detail == 2 || (detail == 1 && abs(Random() % 4) == 0) || (detail == 0 && abs(Random() % 8) == 0))objects.model[k].MakeDecal(blooddecalfast, DoRotation(colpoint - objects.position[k], 0, -objects.yaw[k], 0), sprites[i]->size * 1.6/*+abs((float)(Random()%100))/2400*/, .5, Random() % 360);
+ DeleteSprite(i);
+ spritehit = 1;
+ }
+ }
+ }
+ if (!spritehit)
+ if (sprites[i]->position.y < terrain.getHeight(sprites[i]->position.x, sprites[i]->position.z)) {
+ terrain.MakeDecal(blooddecalfast, sprites[i]->position, sprites[i]->size * 1.6/*+abs((float)(Random()%100))/2400*/, .6, Random() % 360);
+ DeleteSprite(i);
+ }
+ }
+ }
+ if (sprites[i]->type == splintersprite) {
+ sprites[i]->rotation += sprites[i]->rotatespeed * multiplier;
+ sprites[i]->opacity -= multiplier / 2;
+ if (sprites[i]->special == 0 || sprites[i]->special == 2 || sprites[i]->special == 3)sprites[i]->velocity.y += gravity * multiplier;
+ if (sprites[i]->special == 1)sprites[i]->velocity.y += gravity * multiplier * .5;
+ }
+ if (sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite) {
+ sprites[i]->rotation += multiplier * sprites[i]->rotatespeed;
+ sprites[i]->opacity -= multiplier * 5 / 4;
+ if (sprites[i]->type != weaponshinesprite && sprites[i]->type != bloodflamesprite)
+ if (sprites[i]->opacity < .5 && sprites[i]->opacity + multiplier * 5 / 4 >= .5 && (abs(Random() % 4) == 0 || (sprites[i]->initialsize > 2 && Random() % 2 == 0)))
+ MakeSprite(smoketype, sprites[i]->position, sprites[i]->velocity, .9, .9, .6, sprites[i]->size * 1.2, .4);
+ if (sprites[i]->alivetime > .14 && (sprites[i]->type == flamesprite)) {
+ sprites[i]->velocity = 0;
+ sprites[i]->velocity.y = 1.5;
+ }
+ }
+ if (sprites[i]->type == smoketype) {
+ sprites[i]->opacity -= multiplier / 3 / sprites[i]->initialsize;
+ sprites[i]->color[0] -= multiplier;
+ sprites[i]->color[1] -= multiplier;
+ sprites[i]->color[2] -= multiplier;
+ if (sprites[i]->color[0] < .6)sprites[i]->color[0] = .6;
+ if (sprites[i]->color[1] < .6)sprites[i]->color[1] = .6;
+ if (sprites[i]->color[2] < .6)sprites[i]->color[2] = .6;
+ sprites[i]->size += multiplier;
+ sprites[i]->velocity = 0;
+ sprites[i]->velocity.y = 1.5;
+ sprites[i]->rotation += multiplier * sprites[i]->rotatespeed / 5;
+ }
+ if (sprites[i]->opacity <= 0 || sprites[i]->size <= 0)DeleteSprite(i);
+ }
+ if (check)
+ for (i = sprites.size() - 1; i >= 0; i--) {
+ sprites[i]->oldposition = sprites[i]->position;
+ }
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void Sprite::DeleteSprite(int i)
{
- sprites.erase(sprites.begin()+i);
+ sprites.erase(sprites.begin() + i);
}
-void Sprite::MakeSprite(int atype, XYZ where, XYZ avelocity, float red, float green, float blue, float asize, float aopacity){
- if(sprites.size()<max_sprites-1){
- sprites.push_back(new Sprite());
- if((atype!=bloodsprite&&atype!=bloodflamesprite)||bloodtoggle){
- sprites.back()->special=0;
- sprites.back()->type=atype;
- sprites.back()->position=where;
- sprites.back()->oldposition=where;
- sprites.back()->velocity=avelocity;
- sprites.back()->alivetime=0;
- sprites.back()->opacity=aopacity;
- sprites.back()->size=asize;
- sprites.back()->initialsize=asize;
- sprites.back()->color[0]=red;
- sprites.back()->color[1]=green;
- sprites.back()->color[2]=blue;
- sprites.back()->rotatespeed=abs(Random()%720)-360;
- sprites.back()->speed=float(abs(Random()%100))/200+1.5;
- }
- }
+void Sprite::MakeSprite(int atype, XYZ where, XYZ avelocity, float red, float green, float blue, float asize, float aopacity)
+{
+ if (sprites.size() < max_sprites - 1) {
+ sprites.push_back(new Sprite());
+ if ((atype != bloodsprite && atype != bloodflamesprite) || bloodtoggle) {
+ sprites.back()->special = 0;
+ sprites.back()->type = atype;
+ sprites.back()->position = where;
+ sprites.back()->oldposition = where;
+ sprites.back()->velocity = avelocity;
+ sprites.back()->alivetime = 0;
+ sprites.back()->opacity = aopacity;
+ sprites.back()->size = asize;
+ sprites.back()->initialsize = asize;
+ sprites.back()->color[0] = red;
+ sprites.back()->color[1] = green;
+ sprites.back()->color[2] = blue;
+ sprites.back()->rotatespeed = abs(Random() % 720) - 360;
+ sprites.back()->speed = float(abs(Random() % 100)) / 200 + 1.5;
+ }
+ }
}
Sprite::Sprite()
{
- oldposition = 0;
- position = 0;
- velocity = 0;
- size = 0;
- initialsize = 0;
- type = 0;
- special = 0;
- memset(color,0,sizeof(color));
- opacity = 0;
- rotation = 0;
- alivetime = 0;
- speed = 0;
- rotatespeed = 0;
+ oldposition = 0;
+ position = 0;
+ velocity = 0;
+ size = 0;
+ initialsize = 0;
+ type = 0;
+ special = 0;
+ memset(color, 0, sizeof(color));
+ opacity = 0;
+ rotation = 0;
+ alivetime = 0;
+ speed = 0;
+ rotatespeed = 0;
}
void Sprite::clearTextures()
{
- toothtexture.destroy();
- cloudtexture.destroy();
- cloudimpacttexture.destroy();
- bloodtexture.destroy();
- flametexture.destroy();
- bloodflametexture.destroy();
- smoketexture.destroy();
- snowflaketexture.destroy();
- shinetexture.destroy();
- splintertexture.destroy();
- leaftexture.destroy();
+ toothtexture.destroy();
+ cloudtexture.destroy();
+ cloudimpacttexture.destroy();
+ bloodtexture.destroy();
+ flametexture.destroy();
+ bloodflametexture.destroy();
+ smoketexture.destroy();
+ snowflaketexture.destroy();
+ shinetexture.destroy();
+ splintertexture.destroy();
+ leaftexture.destroy();
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#define max_sprites 20000
enum {
- cloudsprite = 0,
- bloodsprite,
- flamesprite,
- smoketype,
- weaponflamesprite,
- cloudimpactsprite,
- snowsprite,
- weaponshinesprite,
- bloodflamesprite,
- breathsprite,
- splintersprite,
- spritenumber
+ cloudsprite = 0,
+ bloodsprite,
+ flamesprite,
+ smoketype,
+ weaponflamesprite,
+ cloudimpactsprite,
+ snowsprite,
+ weaponshinesprite,
+ bloodflamesprite,
+ breathsprite,
+ splintersprite,
+ spritenumber
};
-class Sprite{
- private:
- XYZ oldposition;
- XYZ position;
- XYZ velocity;
- float size;
- float initialsize;
- int type;
- int special;
- float color[3];
- float opacity;
- float rotation;
- float alivetime;
- float speed;
- float rotatespeed;
-
- static float checkdelay;
-
- static vector<Sprite*> sprites;
-
- public:
- static void DeleteSprite(int which);
- static void MakeSprite(int atype, XYZ where, XYZ avelocity, float red, float green, float blue, float asize, float aopacity);
- static void Draw();
- static void deleteSprites() {
- sprites.clear();
- }
- static void setLastSpriteSpecial(int s) {
- sprites.back()->special = s;
- }
- static void setLastSpriteSpeed(int s) {
- sprites.back()->speed = s;
- }
- static void setLastSpriteAlivetime(float al) {
- sprites.back()->alivetime = al;
- }
- static void clearTextures();
-
- static Texture cloudtexture;
- static Texture bloodtexture;
- static Texture flametexture;
- static Texture smoketexture;
-
- static Texture cloudimpacttexture;
- static Texture snowflaketexture;
- static Texture shinetexture;
- static Texture bloodflametexture;
-
- static Texture splintertexture;
-
- static Texture leaftexture;
- static Texture toothtexture;
-
- Sprite();
- ~Sprite();
+class Sprite
+{
+private:
+ XYZ oldposition;
+ XYZ position;
+ XYZ velocity;
+ float size;
+ float initialsize;
+ int type;
+ int special;
+ float color[3];
+ float opacity;
+ float rotation;
+ float alivetime;
+ float speed;
+ float rotatespeed;
+
+ static float checkdelay;
+
+ static vector<Sprite*> sprites;
+
+public:
+ static void DeleteSprite(int which);
+ static void MakeSprite(int atype, XYZ where, XYZ avelocity, float red, float green, float blue, float asize, float aopacity);
+ static void Draw();
+ static void deleteSprites() {
+ sprites.clear();
+ }
+ static void setLastSpriteSpecial(int s) {
+ sprites.back()->special = s;
+ }
+ static void setLastSpriteSpeed(int s) {
+ sprites.back()->speed = s;
+ }
+ static void setLastSpriteAlivetime(float al) {
+ sprites.back()->alivetime = al;
+ }
+ static void clearTextures();
+
+ static Texture cloudtexture;
+ static Texture bloodtexture;
+ static Texture flametexture;
+ static Texture smoketexture;
+
+ static Texture cloudimpacttexture;
+ static Texture snowflaketexture;
+ static Texture shinetexture;
+ static Texture bloodflametexture;
+
+ static Texture splintertexture;
+
+ static Texture leaftexture;
+ static Texture toothtexture;
+
+ Sprite();
+ ~Sprite();
};
#endif
extern int kContextWidth;
extern int kContextHeight;
-bool CanInitStereo(StereoMode mode) {
- GLint stencilbits = 0;
-
- switch(mode) {
- case stereoNone:
- return true;
- break;
- case stereoAnaglyph:
- return true;
- break;
- case stereoHorizontalInterlaced:
- case stereoVerticalInterlaced:
- glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
- if ( stencilbits < 1 ) {
- fprintf(stderr, "Failed to get a stencil buffer, interlaced stereo not available.\n");
- return false;
- } else {
- fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
- }
- return true;
- break;
- default:
- return false;
- }
+bool CanInitStereo(StereoMode mode)
+{
+ GLint stencilbits = 0;
+
+ switch (mode) {
+ case stereoNone:
+ return true;
+ break;
+ case stereoAnaglyph:
+ return true;
+ break;
+ case stereoHorizontalInterlaced:
+ case stereoVerticalInterlaced:
+ glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
+ if ( stencilbits < 1 ) {
+ fprintf(stderr, "Failed to get a stencil buffer, interlaced stereo not available.\n");
+ return false;
+ } else {
+ fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
+ }
+ return true;
+ break;
+ default:
+ return false;
+ }
}
-void InitStereo(StereoMode mode) {
- switch(mode) {
- case stereoNone:
- glDisable( GL_STENCIL_TEST);
- return;
- case stereoAnaglyph:
- glDisable( GL_STENCIL_TEST);
- return;
- case stereoHorizontalInterlaced:
- case stereoVerticalInterlaced:
-
- fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight);
-
- // Setup stencil buffer
- glDisable( GL_DEPTH_TEST);
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
-
- glEnable( GL_STENCIL_TEST);
- glClearStencil(0);
- glClear( GL_STENCIL_BUFFER_BIT );
- glStencilFunc(GL_ALWAYS, 0x1, 0x1);
- glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
-
- // Setup viewport
- glViewport(0,0, kContextWidth, kContextHeight);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
- glDisable(GL_LINE_SMOOTH);
-
- // Add 0.5 to the coordinates, because OpenGL considers a pixel should be
- // turned on when a line passes through the center of it.
- if ( mode == stereoHorizontalInterlaced ) {
- for(int y=0;y<kContextHeight;y+=2) {
- glBegin(GL_LINES);
- glVertex3f(0.5, y+0.5, 0);
- glVertex3f(kContextWidth+0.5, y+0.5, 0);
- glEnd();
- }
- } else {
- for(int x=0;x<kContextWidth;x+=2) {
- glBegin(GL_LINES);
- glVertex3f(x+0.5, 0.5, 0);
- glVertex3f(x+0.5, kContextHeight+0.5, 0);
- glEnd();
- }
- }
-
- glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
-
- glPopMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
-
- glStencilFunc(GL_NOTEQUAL, 0x01, 0x01);
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- glEnable( GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glEnable(GL_LIGHTING);
- glEnable(GL_TEXTURE_2D);
-
- }
-
+void InitStereo(StereoMode mode)
+{
+ switch (mode) {
+ case stereoNone:
+ glDisable( GL_STENCIL_TEST);
+ return;
+ case stereoAnaglyph:
+ glDisable( GL_STENCIL_TEST);
+ return;
+ case stereoHorizontalInterlaced:
+ case stereoVerticalInterlaced:
+
+ fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight);
+
+ // Setup stencil buffer
+ glDisable( GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+
+ glEnable( GL_STENCIL_TEST);
+ glClearStencil(0);
+ glClear( GL_STENCIL_BUFFER_BIT );
+ glStencilFunc(GL_ALWAYS, 0x1, 0x1);
+ glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
+
+ // Setup viewport
+ glViewport(0, 0, kContextWidth, kContextHeight);
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1);
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+ glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
+ glDisable(GL_LINE_SMOOTH);
+
+ // Add 0.5 to the coordinates, because OpenGL considers a pixel should be
+ // turned on when a line passes through the center of it.
+ if ( mode == stereoHorizontalInterlaced ) {
+ for (int y = 0; y < kContextHeight; y += 2) {
+ glBegin(GL_LINES);
+ glVertex3f(0.5, y + 0.5, 0);
+ glVertex3f(kContextWidth + 0.5, y + 0.5, 0);
+ glEnd();
+ }
+ } else {
+ for (int x = 0; x < kContextWidth; x += 2) {
+ glBegin(GL_LINES);
+ glVertex3f(x + 0.5, 0.5, 0);
+ glVertex3f(x + 0.5, kContextHeight + 0.5, 0);
+ glEnd();
+ }
+ }
+
+ glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
+
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glStencilFunc(GL_NOTEQUAL, 0x01, 0x01);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ glEnable( GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_TEXTURE_2D);
+
+ }
+
}
-const char* StereoModeName(StereoMode mode) {
- switch(mode) {
- case stereoNone: return "None"; break;
- case stereoAnaglyph: return "Anaglyph"; break;
- case stereoHorizontalInterlaced: return "Horizontal interlacing"; break;
- case stereoVerticalInterlaced: return "Vertical interlacing"; break;
- case stereoHorizontalSplit: return "Horizontal split"; break;
- case stereoVerticalSplit: return "Vertical split"; break;
- case stereoOpenGL: return "OpenGL"; break;
- default: return "(error)"; break;
- }
+const char* StereoModeName(StereoMode mode)
+{
+ switch (mode) {
+ case stereoNone:
+ return "None";
+ break;
+ case stereoAnaglyph:
+ return "Anaglyph";
+ break;
+ case stereoHorizontalInterlaced:
+ return "Horizontal interlacing";
+ break;
+ case stereoVerticalInterlaced:
+ return "Vertical interlacing";
+ break;
+ case stereoHorizontalSplit:
+ return "Horizontal split";
+ break;
+ case stereoVerticalSplit:
+ return "Vertical split";
+ break;
+ case stereoOpenGL:
+ return "OpenGL";
+ break;
+ default:
+ return "(error)";
+ break;
+ }
}
\ No newline at end of file
#define STEREO_H_
enum StereoMode {
- stereoNone,
- stereoAnaglyph, /* red/cyan */
- stereoHorizontalInterlaced, /* some 3D monitors */
- stereoVerticalInterlaced,
- stereoHorizontalSplit, /* cross-eyed view */
- stereoVerticalSplit,
- stereoOpenGL, /* Whatever OpenGL does, if supported */
- stereoCount /* must be last element */
+ stereoNone,
+ stereoAnaglyph, /* red/cyan */
+ stereoHorizontalInterlaced, /* some 3D monitors */
+ stereoVerticalInterlaced,
+ stereoHorizontalSplit, /* cross-eyed view */
+ stereoVerticalSplit,
+ stereoOpenGL, /* Whatever OpenGL does, if supported */
+ stereoCount /* must be last element */
};
enum StereoSide {
- // Code multiplies by StereoSide to calculate camera offsets
- stereoLeft = -1,
- stereoCenter = 0,
- stereoRight = 1
+ // Code multiplies by StereoSide to calculate camera offsets
+ stereoLeft = -1,
+ stereoCenter = 0,
+ stereoRight = 1
};
extern StereoMode stereomode;
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
/********************> LoadTGA() <*****/
bool upload_image(const unsigned char* filePath, bool hasalpha)
{
- if(visibleloading)
- Game::LoadingScreen();
+ if (visibleloading)
+ Game::LoadingScreen();
#if !PLATFORM_MACOSX
- // for Windows, just use TGA loader for now
- char fileName[256];
- CopyPascalStringToC( filePath, fileName);
-/*
- // change extension to .TGA
- int len = strlen( fileName);
- if (len > 3)
- {
- fileName[ len - 3] = 't';
- fileName[ len - 2] = 'g';
- fileName[ len - 1] = 'a';
- }
-*/
+ // for Windows, just use TGA loader for now
+ char fileName[256];
+ CopyPascalStringToC( filePath, fileName);
+ /*
+ // change extension to .TGA
+ int len = strlen( fileName);
+ if (len > 3)
+ {
+ fileName[ len - 3] = 't';
+ fileName[ len - 2] = 'g';
+ fileName[ len - 1] = 'a';
+ }
+ */
// return (LoadTGA( fileName) != NULL);
- return (LoadImage(fileName, texture));
+ return (LoadImage(fileName, texture));
#else
- OSStatus err;
- ComponentResult cr;
-
- /*FSRef fsref;
- Boolean isdir;
- err = FSPathMakeRef((const UInt8*)filePath, &fsref, &isdir);
- if(err)return;
-
- FSSpec fsspec;
- err = FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL);
- if(err)return;
- */
-
- //Boolean isdir;
- FSSpec fsspec;
- //err = FSMakeFSSpec (0, 0, (const unsigned char*)filePath, &fsspec);
- err = FSMakeFSSpec (0, 0, filePath, &fsspec);
- //err=FSPathMakeFSSpec((const UInt8*)filePath,&fsspec,&isdir);*/
- if(err)return;
-
- GraphicsImportComponent gi;
- err = GetGraphicsImporterForFile(&fsspec, &gi);
- if(err)return;
-
- Rect natbounds;
- cr = GraphicsImportGetNaturalBounds(gi, &natbounds);
-
- //~ size_t buffersize = 4 * natbounds.bottom * natbounds.right;
- //void* buf = malloc(buffersize);
- texture.sizeX=natbounds.right;
- texture.sizeY=natbounds.bottom;
- /*if(hasalpha)*/texture.bpp = 32;
- //if(!hasalpha)texture.bpp = 24;
-
- GWorldPtr gw;
- err = QTNewGWorldFromPtr(&gw, k32ARGBPixelFormat, &natbounds, NULL, NULL,
- 0, texture.data, 4 * natbounds.right);
- if(err)return;
-
- cr = GraphicsImportSetGWorld(gi, gw, NULL);
-
- natbounds.top = natbounds.bottom;
- natbounds.bottom = 0;
-
- cr = GraphicsImportSetBoundsRect(gi, &natbounds);
-
- cr = GraphicsImportDraw(gi);
-
- err = CloseComponent(gi);
- if(err)return;
-
- /*glTexImage2D(textureTarget, 0, GL_RGBA, natbounds.right, natbounds.top, 0,
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf);
- */
-
- //free(buf);
- DisposeGWorld(gw);
-
- // Loop Through The Image Data
- GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram
- GLuint temp; // Temporary Variable
- GLuint bytesPerPixel; // Temporary Variable
- bytesPerPixel=texture.bpp/8;
- imageSize = texture.sizeX * texture.sizeY * bytesPerPixel;
- //~ int alltrans=10;
-
- for( GLuint i = 0; i < int( imageSize ); i += 4 )
- {
- // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
- temp = texture.data[i]; // Temporarily Store The Value At Image Data 'i'
- texture.data[i] = texture.data[i + 1]; // Set The 1st Byte To The Value Of The 3rd Byte
- texture.data[i + 1] = texture.data[i + 2]; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
- texture.data[i + 2] = texture.data[i + 3];
- texture.data[i + 3] = temp;
- }
-
- //~ int tempplace;
- //~ tempplace=0;
- if(!hasalpha){
- for( GLuint i = 0; i < int( imageSize ); i += 4 )
- {
- texture.data[i + 3] = 255;
- /*texture.data[tempplace] = texture.data[i]; // Set The 1st Byte To The Value Of The 3rd Byte
- texture.data[tempplace + 1] = texture.data[i + 1]; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
- texture.data[tempplace + 2] = texture.data[i + 2];
- tempplace+=3;*/
- }
- }
-
- if(texdetail>1){
- int which=0;
- float temp;
- float howmany;
- for( GLuint k = 0; k < int( imageSize); k += bytesPerPixel*texture.sizeX*texdetail )
- {
- for( GLuint i = 0; i < int( imageSize/texture.sizeY ); i += bytesPerPixel*texdetail )
- {
- for( GLuint b = 0; b < bytesPerPixel ; b ++ ){
- temp=0;
- howmany=0;
- for( GLuint l = 0; l < texdetail*texture.sizeX ; l +=texture.sizeX ){
- for( GLuint j = 0; j < texdetail ; j ++ )
- {
- temp += (int)texture.data[k+i+j*bytesPerPixel+l*bytesPerPixel+b]; // Set The 1st Byte To The Value Of The 3rd Byte
- howmany++;
- }
- }
- texture.data[which+b]=GLubyte(temp/howmany);
- }
- which+=bytesPerPixel;
- }
- }
- texture.sizeX/=texdetail;
- texture.sizeY/=texdetail;
- }
-
- return true;
+ OSStatus err;
+ ComponentResult cr;
+
+ /*FSRef fsref;
+ Boolean isdir;
+ err = FSPathMakeRef((const UInt8*)filePath, &fsref, &isdir);
+ if(err)return;
+
+ FSSpec fsspec;
+ err = FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL);
+ if(err)return;
+ */
+
+ //Boolean isdir;
+ FSSpec fsspec;
+ //err = FSMakeFSSpec (0, 0, (const unsigned char*)filePath, &fsspec);
+ err = FSMakeFSSpec (0, 0, filePath, &fsspec);
+ //err=FSPathMakeFSSpec((const UInt8*)filePath,&fsspec,&isdir);*/
+ if (err)return;
+
+ GraphicsImportComponent gi;
+ err = GetGraphicsImporterForFile(&fsspec, &gi);
+ if (err)return;
+
+ Rect natbounds;
+ cr = GraphicsImportGetNaturalBounds(gi, &natbounds);
+
+ //~ size_t buffersize = 4 * natbounds.bottom * natbounds.right;
+ //void* buf = malloc(buffersize);
+ texture.sizeX = natbounds.right;
+ texture.sizeY = natbounds.bottom;
+ /*if(hasalpha)*/
+ texture.bpp = 32;
+ //if(!hasalpha)texture.bpp = 24;
+
+ GWorldPtr gw;
+ err = QTNewGWorldFromPtr(&gw, k32ARGBPixelFormat, &natbounds, NULL, NULL,
+ 0, texture.data, 4 * natbounds.right);
+ if (err)return;
+
+ cr = GraphicsImportSetGWorld(gi, gw, NULL);
+
+ natbounds.top = natbounds.bottom;
+ natbounds.bottom = 0;
+
+ cr = GraphicsImportSetBoundsRect(gi, &natbounds);
+
+ cr = GraphicsImportDraw(gi);
+
+ err = CloseComponent(gi);
+ if (err)return;
+
+ /*glTexImage2D(textureTarget, 0, GL_RGBA, natbounds.right, natbounds.top, 0,
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf);
+ */
+
+ //free(buf);
+ DisposeGWorld(gw);
+
+ // Loop Through The Image Data
+ GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram
+ GLuint temp; // Temporary Variable
+ GLuint bytesPerPixel; // Temporary Variable
+ bytesPerPixel = texture.bpp / 8;
+ imageSize = texture.sizeX * texture.sizeY * bytesPerPixel;
+ //~ int alltrans=10;
+
+ for ( GLuint i = 0; i < int( imageSize ); i += 4 ) {
+ // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
+ temp = texture.data[i]; // Temporarily Store The Value At Image Data 'i'
+ texture.data[i] = texture.data[i + 1]; // Set The 1st Byte To The Value Of The 3rd Byte
+ texture.data[i + 1] = texture.data[i + 2]; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
+ texture.data[i + 2] = texture.data[i + 3];
+ texture.data[i + 3] = temp;
+ }
+
+ //~ int tempplace;
+ //~ tempplace=0;
+ if (!hasalpha) {
+ for ( GLuint i = 0; i < int( imageSize ); i += 4 ) {
+ texture.data[i + 3] = 255;
+ /*texture.data[tempplace] = texture.data[i]; // Set The 1st Byte To The Value Of The 3rd Byte
+ texture.data[tempplace + 1] = texture.data[i + 1]; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
+ texture.data[tempplace + 2] = texture.data[i + 2];
+ tempplace+=3;*/
+ }
+ }
+
+ if (texdetail > 1) {
+ int which = 0;
+ float temp;
+ float howmany;
+ for ( GLuint k = 0; k < int( imageSize); k += bytesPerPixel * texture.sizeX * texdetail ) {
+ for ( GLuint i = 0; i < int( imageSize / texture.sizeY ); i += bytesPerPixel * texdetail ) {
+ for ( GLuint b = 0; b < bytesPerPixel ; b ++ ) {
+ temp = 0;
+ howmany = 0;
+ for ( GLuint l = 0; l < texdetail * texture.sizeX ; l += texture.sizeX ) {
+ for ( GLuint j = 0; j < texdetail ; j ++ ) {
+ temp += (int)texture.data[k + i + j * bytesPerPixel + l * bytesPerPixel + b]; // Set The 1st Byte To The Value Of The 3rd Byte
+ howmany++;
+ }
+ }
+ texture.data[which + b] = GLubyte(temp / howmany);
+ }
+ which += bytesPerPixel;
+ }
+ }
+ texture.sizeX /= texdetail;
+ texture.sizeY /= texdetail;
+ }
+
+ return true;
#endif
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
//#include <QuickTime.h>
/**> DATA STRUCTURES <**/
-typedef struct TGAImageRec
-{
- GLubyte *data; // Image Data (Up To 32 Bits)
- GLuint bpp; // Image Color Depth In Bits Per Pixel.
- GLuint sizeX;
- GLuint sizeY;
+typedef struct TGAImageRec {
+ GLubyte *data; // Image Data (Up To 32 Bits)
+ GLuint bpp; // Image Color Depth In Bits Per Pixel.
+ GLuint sizeX;
+ GLuint sizeY;
} TGAImageRec;
bool upload_image(const unsigned char* filePath, bool hasalpha);
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
//Functions
-int Terrain::lineTerrain(XYZ p1,XYZ p2, XYZ *p)
+int Terrain::lineTerrain(XYZ p1, XYZ p2, XYZ *p)
{
- static int i,j,k;
- static float distance;
- static float olddistance;
- static int intersecting;
- static int firstintersecting;
- static XYZ point;
- static int startx,starty;
- static float slope;
- static int endx,endy;
- static int numtris=(size-1)*(size-1)*2;
- static float highest,lowest;
-
- firstintersecting=-1;
- olddistance=10000;
- distance=1;
-
- XYZ triangles[3];
-
- p1/=scale;
- p2/=scale;
-
- startx=p1.x;
- starty=p1.z;
- endx=p2.x;
- endy=p2.z;
-
- if(startx>endx){i=endx;endx=startx;startx=i;}
- if(starty>endy){i=endy;endy=starty;starty=i;}
-
- if(startx<0)startx=0;
- if(starty<0)starty=0;
- if(endx>size-1)endx=size-1;
- if(endy>size-1)endy=size-1;
-
- for(i=startx;i<=endx;i++){
- for(j=starty;j<=endy;j++){
- highest=-1000;
- lowest=1000;
- for(k=0;k<2;k++){
- if(heightmap[i+k][j]>highest)highest=heightmap[i+k][j];
- if(heightmap[i+k][j]<lowest)lowest=heightmap[i+k][j];
- if(heightmap[i+k][j+1]>highest)highest=heightmap[i+k][j+1];
- if(heightmap[i+k][j+1]<lowest)lowest=heightmap[i+k][j+1];
- }
- if((p1.y<=highest||p2.y<=highest)&&(p1.y>=lowest||p2.y>=lowest)){
- triangles[0].x=i;
- triangles[0].y=heightmap[i][j];
- triangles[0].z=j;
-
- triangles[1].x=i;
- triangles[1].y=heightmap[i][j+1];
- triangles[1].z=j+1;
-
- triangles[2].x=i+1;
- triangles[2].y=heightmap[i+1][j];
- triangles[2].z=j;
-
- intersecting=LineFacet(p1,p2,triangles[0],triangles[1],triangles[2],&point);
- distance=distsq(&p1,&point);
- if((distance<olddistance||firstintersecting==-1)&&intersecting==1){olddistance=distance; firstintersecting=1; *p=point;}
-
- triangles[0].x=i+1;
- triangles[0].y=heightmap[i+1][j];
- triangles[0].z=j;
-
- triangles[1].x=i;
- triangles[1].y=heightmap[i][j+1];
- triangles[1].z=j+1;
-
- triangles[2].x=i+1;
- triangles[2].y=heightmap[i+1][j+1];
- triangles[2].z=j+1;
-
- intersecting=LineFacet(p1,p2,triangles[0],triangles[1],triangles[2],&point);
- distance=distsq(&p1,&point);
- if((distance<olddistance||firstintersecting==-1)&&intersecting==1){olddistance=distance; firstintersecting=1; *p=point;}
- }
- }
- }
- return firstintersecting;
+ static int i, j, k;
+ static float distance;
+ static float olddistance;
+ static int intersecting;
+ static int firstintersecting;
+ static XYZ point;
+ static int startx, starty;
+ static float slope;
+ static int endx, endy;
+ static int numtris = (size - 1) * (size - 1) * 2;
+ static float highest, lowest;
+
+ firstintersecting = -1;
+ olddistance = 10000;
+ distance = 1;
+
+ XYZ triangles[3];
+
+ p1 /= scale;
+ p2 /= scale;
+
+ startx = p1.x;
+ starty = p1.z;
+ endx = p2.x;
+ endy = p2.z;
+
+ if (startx > endx) {
+ i = endx;
+ endx = startx;
+ startx = i;
+ }
+ if (starty > endy) {
+ i = endy;
+ endy = starty;
+ starty = i;
+ }
+
+ if (startx < 0)startx = 0;
+ if (starty < 0)starty = 0;
+ if (endx > size - 1)endx = size - 1;
+ if (endy > size - 1)endy = size - 1;
+
+ for (i = startx; i <= endx; i++) {
+ for (j = starty; j <= endy; j++) {
+ highest = -1000;
+ lowest = 1000;
+ for (k = 0; k < 2; k++) {
+ if (heightmap[i + k][j] > highest)highest = heightmap[i + k][j];
+ if (heightmap[i + k][j] < lowest)lowest = heightmap[i + k][j];
+ if (heightmap[i + k][j + 1] > highest)highest = heightmap[i + k][j + 1];
+ if (heightmap[i + k][j + 1] < lowest)lowest = heightmap[i + k][j + 1];
+ }
+ if ((p1.y <= highest || p2.y <= highest) && (p1.y >= lowest || p2.y >= lowest)) {
+ triangles[0].x = i;
+ triangles[0].y = heightmap[i][j];
+ triangles[0].z = j;
+
+ triangles[1].x = i;
+ triangles[1].y = heightmap[i][j + 1];
+ triangles[1].z = j + 1;
+
+ triangles[2].x = i + 1;
+ triangles[2].y = heightmap[i + 1][j];
+ triangles[2].z = j;
+
+ intersecting = LineFacet(p1, p2, triangles[0], triangles[1], triangles[2], &point);
+ distance = distsq(&p1, &point);
+ if ((distance < olddistance || firstintersecting == -1) && intersecting == 1) {
+ olddistance = distance;
+ firstintersecting = 1;
+ *p = point;
+ }
+
+ triangles[0].x = i + 1;
+ triangles[0].y = heightmap[i + 1][j];
+ triangles[0].z = j;
+
+ triangles[1].x = i;
+ triangles[1].y = heightmap[i][j + 1];
+ triangles[1].z = j + 1;
+
+ triangles[2].x = i + 1;
+ triangles[2].y = heightmap[i + 1][j + 1];
+ triangles[2].z = j + 1;
+
+ intersecting = LineFacet(p1, p2, triangles[0], triangles[1], triangles[2], &point);
+ distance = distsq(&p1, &point);
+ if ((distance < olddistance || firstintersecting == -1) && intersecting == 1) {
+ olddistance = distance;
+ firstintersecting = 1;
+ *p = point;
+ }
+ }
+ }
+ }
+ return firstintersecting;
}
-void Terrain::UpdateTransparency(int whichx, int whichy){
- static XYZ vertex;
- static int i,j,a,b,c,d,patch_size,stepsize;
- static float distance;
+void Terrain::UpdateTransparency(int whichx, int whichy)
+{
+ static XYZ vertex;
+ static int i, j, a, b, c, d, patch_size, stepsize;
+ static float distance;
- static float viewdistsquared;
+ static float viewdistsquared;
- viewdistsquared=viewdistance*viewdistance;
- patch_size=size/subdivision;
+ viewdistsquared = viewdistance * viewdistance;
+ patch_size = size / subdivision;
- stepsize=1;
- c=whichx*patch_elements+whichy*patch_elements*subdivision;
+ stepsize = 1;
+ c = whichx * patch_elements + whichy * patch_elements * subdivision;
- for(i=patch_size*whichx;i<patch_size*(whichx+1)+1;i+=stepsize){
- for(j=patch_size*whichy;j<patch_size*(whichy+1)+1;j+=stepsize){
- if(i<size&&j<size){
- vertex.x=i*scale;
- vertex.z=j*scale;
- vertex.y=heightmap[i][j]*scale;
- distance=distsq(&viewer,&vertex);
- if(distance>viewdistsquared)distance=viewdistsquared;
- colors[i][j][3]=(viewdistsquared-(distance-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
- }
- }
- }
+ for (i = patch_size * whichx; i < patch_size * (whichx + 1) + 1; i += stepsize) {
+ for (j = patch_size * whichy; j < patch_size * (whichy + 1) + 1; j += stepsize) {
+ if (i < size && j < size) {
+ vertex.x = i * scale;
+ vertex.z = j * scale;
+ vertex.y = heightmap[i][j] * scale;
+ distance = distsq(&viewer, &vertex);
+ if (distance > viewdistsquared)distance = viewdistsquared;
+ colors[i][j][3] = (viewdistsquared - (distance - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+ }
+ }
+ }
- for(i=patch_size*whichx;i<patch_size*(whichx+1);i+=stepsize){
- for(j=patch_size*whichy;j<patch_size*(whichy+1);j+=stepsize){
- a=(i-(patch_size*whichx))/stepsize;
- b=(j-(patch_size*whichy))/stepsize;
- d=(a*54)+(b*54*patch_size/stepsize);
- vArray[d+c+6]=colors[i][j][3];
+ for (i = patch_size * whichx; i < patch_size * (whichx + 1); i += stepsize) {
+ for (j = patch_size * whichy; j < patch_size * (whichy + 1); j += stepsize) {
+ a = (i - (patch_size * whichx)) / stepsize;
+ b = (j - (patch_size * whichy)) / stepsize;
+ d = (a * 54) + (b * 54 * patch_size / stepsize);
+ vArray[d + c + 6] = colors[i][j][3];
- vArray[d+c+15]=colors[i][j+stepsize][3];
+ vArray[d + c + 15] = colors[i][j + stepsize][3];
- vArray[d+c+24]=colors[i+stepsize][j][3];
+ vArray[d + c + 24] = colors[i + stepsize][j][3];
- vArray[d+c+33]=colors[i+stepsize][j][3];
+ vArray[d + c + 33] = colors[i + stepsize][j][3];
- vArray[d+c+42]=colors[i][j+stepsize][3];
+ vArray[d + c + 42] = colors[i][j + stepsize][3];
- vArray[d+c+51]=colors[i+stepsize][j+stepsize][3];
- }
- }
+ vArray[d + c + 51] = colors[i + stepsize][j + stepsize][3];
+ }
+ }
}
-void Terrain::UpdateTransparencyother(int whichx, int whichy){
- static XYZ vertex;
- static int i,j,a,b,c,d,patch_size,stepsize;
- static float distance;
+void Terrain::UpdateTransparencyother(int whichx, int whichy)
+{
+ static XYZ vertex;
+ static int i, j, a, b, c, d, patch_size, stepsize;
+ static float distance;
- patch_size=size/subdivision;
+ patch_size = size / subdivision;
- stepsize=1;
- c=whichx*patch_elements+whichy*patch_elements*subdivision;
+ stepsize = 1;
+ c = whichx * patch_elements + whichy * patch_elements * subdivision;
- for(i=patch_size*whichx;i<patch_size*(whichx+1);i+=stepsize){
- for(j=patch_size*whichy;j<patch_size*(whichy+1);j+=stepsize){
- a=(i-(patch_size*whichx))/stepsize;
- b=(j-(patch_size*whichy))/stepsize;
- d=(a*54)+(b*54*patch_size/stepsize);
- vArray[d+c+6]=colors[i][j][3]*opacityother[i][j];
+ for (i = patch_size * whichx; i < patch_size * (whichx + 1); i += stepsize) {
+ for (j = patch_size * whichy; j < patch_size * (whichy + 1); j += stepsize) {
+ a = (i - (patch_size * whichx)) / stepsize;
+ b = (j - (patch_size * whichy)) / stepsize;
+ d = (a * 54) + (b * 54 * patch_size / stepsize);
+ vArray[d + c + 6] = colors[i][j][3] * opacityother[i][j];
- vArray[d+c+15]=colors[i][j+stepsize][3]*opacityother[i][j+stepsize];
+ vArray[d + c + 15] = colors[i][j + stepsize][3] * opacityother[i][j + stepsize];
- vArray[d+c+24]=colors[i+stepsize][j][3]*opacityother[i+stepsize][j];
+ vArray[d + c + 24] = colors[i + stepsize][j][3] * opacityother[i + stepsize][j];
- vArray[d+c+33]=colors[i+stepsize][j][3]*opacityother[i+stepsize][j];
+ vArray[d + c + 33] = colors[i + stepsize][j][3] * opacityother[i + stepsize][j];
- vArray[d+c+42]=colors[i][j+stepsize][3]*opacityother[i][j+stepsize];
+ vArray[d + c + 42] = colors[i][j + stepsize][3] * opacityother[i][j + stepsize];
- vArray[d+c+51]=colors[i+stepsize][j+stepsize][3]*opacityother[i+stepsize][j+stepsize];
- }
- }
+ vArray[d + c + 51] = colors[i + stepsize][j + stepsize][3] * opacityother[i + stepsize][j + stepsize];
+ }
+ }
}
-void Terrain::UpdateTransparencyotherother(int whichx, int whichy){
- static XYZ vertex;
- static int i,j,a,b,c,d,patch_size,stepsize;
- static float distance;
+void Terrain::UpdateTransparencyotherother(int whichx, int whichy)
+{
+ static XYZ vertex;
+ static int i, j, a, b, c, d, patch_size, stepsize;
+ static float distance;
- static float viewdistsquared;
+ static float viewdistsquared;
- viewdistsquared=viewdistance*viewdistance;
- patch_size=size/subdivision;
+ viewdistsquared = viewdistance * viewdistance;
+ patch_size = size / subdivision;
- stepsize=1;
- c=whichx*patch_elements+whichy*patch_elements*subdivision;
+ stepsize = 1;
+ c = whichx * patch_elements + whichy * patch_elements * subdivision;
- for(i=patch_size*whichx;i<patch_size*(whichx+1)+1;i+=stepsize){
- for(j=patch_size*whichy;j<patch_size*(whichy+1)+1;j+=stepsize){
- if(i<size&&j<size){
- vertex.x=i*scale;
- vertex.z=j*scale;
- vertex.y=heightmap[i][j]*scale;
- distance=distsq(&viewer,&vertex);
- if(distance>viewdistsquared)distance=viewdistsquared;
- colors[i][j][3]=(viewdistsquared-(distance-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
- }
- }
- }
+ for (i = patch_size * whichx; i < patch_size * (whichx + 1) + 1; i += stepsize) {
+ for (j = patch_size * whichy; j < patch_size * (whichy + 1) + 1; j += stepsize) {
+ if (i < size && j < size) {
+ vertex.x = i * scale;
+ vertex.z = j * scale;
+ vertex.y = heightmap[i][j] * scale;
+ distance = distsq(&viewer, &vertex);
+ if (distance > viewdistsquared)distance = viewdistsquared;
+ colors[i][j][3] = (viewdistsquared - (distance - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+ }
+ }
+ }
- for(i=patch_size*whichx;i<patch_size*(whichx+1);i+=stepsize){
- for(j=patch_size*whichy;j<patch_size*(whichy+1);j+=stepsize){
- a=(i-(patch_size*whichx))/stepsize;
- b=(j-(patch_size*whichy))/stepsize;
- d=(a*54)+(b*54*patch_size/stepsize);
- vArray[d+c+6]=colors[i][j][3];
+ for (i = patch_size * whichx; i < patch_size * (whichx + 1); i += stepsize) {
+ for (j = patch_size * whichy; j < patch_size * (whichy + 1); j += stepsize) {
+ a = (i - (patch_size * whichx)) / stepsize;
+ b = (j - (patch_size * whichy)) / stepsize;
+ d = (a * 54) + (b * 54 * patch_size / stepsize);
+ vArray[d + c + 6] = colors[i][j][3];
- vArray[d+c+15]=colors[i][j+stepsize][3];
+ vArray[d + c + 15] = colors[i][j + stepsize][3];
- vArray[d+c+24]=colors[i+stepsize][j][3];
+ vArray[d + c + 24] = colors[i + stepsize][j][3];
- vArray[d+c+33]=colors[i+stepsize][j][3];
+ vArray[d + c + 33] = colors[i + stepsize][j][3];
- vArray[d+c+42]=colors[i][j+stepsize][3];
+ vArray[d + c + 42] = colors[i][j + stepsize][3];
- vArray[d+c+51]=colors[i+stepsize][j+stepsize][3];
- }
- }
+ vArray[d + c + 51] = colors[i + stepsize][j + stepsize][3];
+ }
+ }
}
-void Terrain::UpdateVertexArray(int whichx, int whichy){
- static int i,j,a,b,c,patch_size,stepsize;
-
-
- numtris[whichx][whichy]=0;
-
- patch_size=size/subdivision;
-
- stepsize=1;
- c=whichx*patch_elements+whichy*patch_elements*subdivision;
- for(i=patch_size*whichx;i<patch_size*(whichx+1);i+=stepsize){
- for(j=patch_size*whichy;j<patch_size*(whichy+1);j+=stepsize){
- a=(i-((float)size/subdivision*(float)whichx))/stepsize;
- b=(j-((float)size/subdivision*(float)whichy))/stepsize;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+0]=i*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+1]=heightmap[i][j]*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+2]=j*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+3]=colors[i][j][0];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+4]=colors[i][j][1];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+5]=colors[i][j][2];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+6]=colors[i][j][3];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+7]=i*scale*texscale+texoffsetx[i][j];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+8]=j*scale*texscale+texoffsety[i][j];
-
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+9]=i*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+10]=heightmap[i][j+stepsize]*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+11]=j*scale+stepsize*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+12]=colors[i][j+stepsize][0];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+13]=colors[i][j+stepsize][1];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+14]=colors[i][j+stepsize][2];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+15]=colors[i][j+stepsize][3];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+16]=i*scale*texscale+texoffsetx[i][j+stepsize];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+17]=j*scale*texscale+stepsize*scale*texscale+texoffsety[i][j+stepsize];
-
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+18]=i*scale+stepsize*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+19]=heightmap[i+stepsize][j]*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+20]=j*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+21]=colors[i+stepsize][j][0];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+22]=colors[i+stepsize][j][1];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+23]=colors[i+stepsize][j][2];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+24]=colors[i+stepsize][j][3];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+25]=i*scale*texscale+stepsize*scale*texscale+texoffsetx[i+stepsize][j];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+26]=j*scale*texscale+texoffsety[i+stepsize][j];
-
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+27]=i*scale+stepsize*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+28]=heightmap[i+stepsize][j]*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+29]=j*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+30]=colors[i+stepsize][j][0];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+31]=colors[i+stepsize][j][1];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+32]=colors[i+stepsize][j][2];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+33]=colors[i+stepsize][j][3];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+34]=i*scale*texscale+stepsize*scale*texscale+texoffsetx[i+stepsize][j];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+35]=j*scale*texscale+texoffsety[i+stepsize][j];
-
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+36]=i*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+37]=heightmap[i][j+stepsize]*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+38]=j*scale+stepsize*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+39]=colors[i][j+stepsize][0];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+40]=colors[i][j+stepsize][1];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+41]=colors[i][j+stepsize][2];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+42]=colors[i][j+stepsize][3];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+43]=i*scale*texscale+texoffsetx[i][j+stepsize];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+44]=j*scale*texscale+stepsize*scale*texscale+texoffsety[i][j+stepsize];
-
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+45]=i*scale+stepsize*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+46]=heightmap[i+stepsize][j+stepsize]*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+47]=j*scale+stepsize*scale;
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+48]=colors[i+stepsize][j+stepsize][0];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+49]=colors[i+stepsize][j+stepsize][1];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+50]=colors[i+stepsize][j+stepsize][2];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+51]=colors[i+stepsize][j+stepsize][3];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+52]=i*scale*texscale+stepsize*scale*texscale+texoffsetx[i+stepsize][j+stepsize];
- vArray[(a*54)+(b*54*patch_size/stepsize)+c+53]=j*scale*texscale+stepsize*scale*texscale+texoffsety[i+stepsize][j+stepsize];
- numtris[whichx][whichy]+=2;
- }
- }
-
- maxypatch[whichx][whichy]=-10000;
- minypatch[whichx][whichy]=10000;
- for(a=0;a<size/subdivision;a++){
- for(b=0;b<size/subdivision;b++){
- if(heightmap[(size/subdivision)*whichx+a][(size/subdivision)*whichy+b]*scale>maxypatch[whichx][whichy]) maxypatch[whichx][whichy]=heightmap[(size/subdivision)*whichx+a][(size/subdivision)*whichy+b]*scale;
- if(heightmap[(size/subdivision)*whichx+a][(size/subdivision)*whichy+b]*scale<minypatch[whichx][whichy]) minypatch[whichx][whichy]=heightmap[(size/subdivision)*whichx+a][(size/subdivision)*whichy+b]*scale;
- }
- }
- heightypatch[whichx][whichy]=(maxypatch[whichx][whichy]-minypatch[whichx][whichy]);
- if(heightypatch[whichx][whichy]<size/subdivision*scale)heightypatch[whichx][whichy]=size/subdivision*scale;
- avgypatch[whichx][whichy]=(minypatch[whichx][whichy]+maxypatch[whichx][whichy])/2;
-
- for(i=whichx*size/subdivision;i<(whichx+1)*size/subdivision-1;i++){
- for(j=whichy*size/subdivision;j<(whichy+1)*size/subdivision-1;j++){
- triangles[(i*(size-1)*2)+(j*2)][0].x=i*scale;
- triangles[(i*(size-1)*2)+(j*2)][0].y=heightmap[i][j]*scale;
- triangles[(i*(size-1)*2)+(j*2)][0].z=j*scale;
-
- triangles[(i*(size-1)*2)+(j*2)][1].x=i*scale;
- triangles[(i*(size-1)*2)+(j*2)][1].y=heightmap[i][j+1]*scale;
- triangles[(i*(size-1)*2)+(j*2)][1].z=j*scale+scale;
-
- triangles[(i*(size-1)*2)+(j*2)][2].x=i*scale+1*scale;
- triangles[(i*(size-1)*2)+(j*2)][2].y=heightmap[i+1][j]*scale;
- triangles[(i*(size-1)*2)+(j*2)][2].z=j*scale;
-
- triangles[(i*(size-1)*2)+(j*2)+1][0].x=i*scale+1*scale;
- triangles[(i*(size-1)*2)+(j*2)+1][0].y=heightmap[i+1][j]*scale;
- triangles[(i*(size-1)*2)+(j*2)+1][0].z=j*scale;
-
- triangles[(i*(size-1)*2)+(j*2)+1][1].x=i*scale;
- triangles[(i*(size-1)*2)+(j*2)+1][1].y=heightmap[i][j+1]*scale;
- triangles[(i*(size-1)*2)+(j*2)+1][1].z=j*scale+1*scale;
-
- triangles[(i*(size-1)*2)+(j*2)+1][2].x=i*scale+1*scale;
- triangles[(i*(size-1)*2)+(j*2)+1][2].y=heightmap[i+1][j+1]*scale;
- triangles[(i*(size-1)*2)+(j*2)+1][2].z=j*scale+1*scale;
- }
- }
+void Terrain::UpdateVertexArray(int whichx, int whichy)
+{
+ static int i, j, a, b, c, patch_size, stepsize;
+
+
+ numtris[whichx][whichy] = 0;
+
+ patch_size = size / subdivision;
+
+ stepsize = 1;
+ c = whichx * patch_elements + whichy * patch_elements * subdivision;
+ for (i = patch_size * whichx; i < patch_size * (whichx + 1); i += stepsize) {
+ for (j = patch_size * whichy; j < patch_size * (whichy + 1); j += stepsize) {
+ a = (i - ((float)size / subdivision * (float)whichx)) / stepsize;
+ b = (j - ((float)size / subdivision * (float)whichy)) / stepsize;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 0] = i * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 1] = heightmap[i][j] * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 2] = j * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 3] = colors[i][j][0];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 4] = colors[i][j][1];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 5] = colors[i][j][2];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 6] = colors[i][j][3];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 7] = i * scale * texscale + texoffsetx[i][j];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 8] = j * scale * texscale + texoffsety[i][j];
+
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 9] = i * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 10] = heightmap[i][j + stepsize] * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 11] = j * scale + stepsize * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 12] = colors[i][j + stepsize][0];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 13] = colors[i][j + stepsize][1];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 14] = colors[i][j + stepsize][2];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 15] = colors[i][j + stepsize][3];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 16] = i * scale * texscale + texoffsetx[i][j + stepsize];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 17] = j * scale * texscale + stepsize * scale * texscale + texoffsety[i][j + stepsize];
+
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 18] = i * scale + stepsize * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 19] = heightmap[i + stepsize][j] * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 20] = j * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 21] = colors[i + stepsize][j][0];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 22] = colors[i + stepsize][j][1];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 23] = colors[i + stepsize][j][2];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 24] = colors[i + stepsize][j][3];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 25] = i * scale * texscale + stepsize * scale * texscale + texoffsetx[i + stepsize][j];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 26] = j * scale * texscale + texoffsety[i + stepsize][j];
+
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 27] = i * scale + stepsize * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 28] = heightmap[i + stepsize][j] * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 29] = j * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 30] = colors[i + stepsize][j][0];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 31] = colors[i + stepsize][j][1];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 32] = colors[i + stepsize][j][2];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 33] = colors[i + stepsize][j][3];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 34] = i * scale * texscale + stepsize * scale * texscale + texoffsetx[i + stepsize][j];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 35] = j * scale * texscale + texoffsety[i + stepsize][j];
+
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 36] = i * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 37] = heightmap[i][j + stepsize] * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 38] = j * scale + stepsize * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 39] = colors[i][j + stepsize][0];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 40] = colors[i][j + stepsize][1];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 41] = colors[i][j + stepsize][2];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 42] = colors[i][j + stepsize][3];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 43] = i * scale * texscale + texoffsetx[i][j + stepsize];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 44] = j * scale * texscale + stepsize * scale * texscale + texoffsety[i][j + stepsize];
+
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 45] = i * scale + stepsize * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 46] = heightmap[i + stepsize][j + stepsize] * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 47] = j * scale + stepsize * scale;
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 48] = colors[i + stepsize][j + stepsize][0];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 49] = colors[i + stepsize][j + stepsize][1];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 50] = colors[i + stepsize][j + stepsize][2];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 51] = colors[i + stepsize][j + stepsize][3];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 52] = i * scale * texscale + stepsize * scale * texscale + texoffsetx[i + stepsize][j + stepsize];
+ vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 53] = j * scale * texscale + stepsize * scale * texscale + texoffsety[i + stepsize][j + stepsize];
+ numtris[whichx][whichy] += 2;
+ }
+ }
+
+ maxypatch[whichx][whichy] = -10000;
+ minypatch[whichx][whichy] = 10000;
+ for (a = 0; a < size / subdivision; a++) {
+ for (b = 0; b < size / subdivision; b++) {
+ if (heightmap[(size / subdivision)*whichx + a][(size / subdivision)*whichy + b]*scale > maxypatch[whichx][whichy]) maxypatch[whichx][whichy] = heightmap[(size / subdivision) * whichx + a][(size / subdivision) * whichy + b] * scale;
+ if (heightmap[(size / subdivision)*whichx + a][(size / subdivision)*whichy + b]*scale < minypatch[whichx][whichy]) minypatch[whichx][whichy] = heightmap[(size / subdivision) * whichx + a][(size / subdivision) * whichy + b] * scale;
+ }
+ }
+ heightypatch[whichx][whichy] = (maxypatch[whichx][whichy] - minypatch[whichx][whichy]);
+ if (heightypatch[whichx][whichy] < size / subdivision * scale)heightypatch[whichx][whichy] = size / subdivision * scale;
+ avgypatch[whichx][whichy] = (minypatch[whichx][whichy] + maxypatch[whichx][whichy]) / 2;
+
+ for (i = whichx * size / subdivision; i < (whichx + 1)*size / subdivision - 1; i++) {
+ for (j = whichy * size / subdivision; j < (whichy + 1)*size / subdivision - 1; j++) {
+ triangles[(i * (size - 1) * 2) + (j * 2)][0].x = i * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2)][0].y = heightmap[i][j] * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2)][0].z = j * scale;
+
+ triangles[(i * (size - 1) * 2) + (j * 2)][1].x = i * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2)][1].y = heightmap[i][j + 1] * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2)][1].z = j * scale + scale;
+
+ triangles[(i * (size - 1) * 2) + (j * 2)][2].x = i * scale + 1 * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2)][2].y = heightmap[i + 1][j] * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2)][2].z = j * scale;
+
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][0].x = i * scale + 1 * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][0].y = heightmap[i + 1][j] * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][0].z = j * scale;
+
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][1].x = i * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][1].y = heightmap[i][j + 1] * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][1].z = j * scale + 1 * scale;
+
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][2].x = i * scale + 1 * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][2].y = heightmap[i + 1][j + 1] * scale;
+ triangles[(i * (size - 1) * 2) + (j * 2) + 1][2].z = j * scale + 1 * scale;
+ }
+ }
}
bool Terrain::load(const char *fileName)
{
- static long i,j;
- static long x,y;
- static float patch_size;
-
- float temptexdetail=texdetail;
- //LoadTGA( fileName );
-
- // Fixing filename so that it works with its own os
- char * FixedFN = ConvertFileName(fileName);
-
- unsigned char fileNamep[256];
- CopyCStringToPascal(FixedFN, fileNamep);
- //Load Image
- upload_image( fileNamep ,0);
-
- //Is it valid?
- if(texture.bpp>24){
- int bytesPerPixel=texture.bpp/8;
-
- int tempnum=0;
- for(i=0;i<(long)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){
- if((i+1)%4){
- texture.data[tempnum]=texture.data[i];
- tempnum++;
- }
- }
- }
- texture.bpp=24;
- if(visibleloading) Game::LoadingScreen();
-
- texdetail=temptexdetail;
-
- size=128;
- if(1==1){
- /*if ( texture.bpp == 24 )
- type = GL_RGB;
- else
- type = GL_RGBA;
-
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
-
- if(!terraintexture)glGenTextures( 1, &terraintexture );
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-
- glBindTexture( GL_TEXTURE_2D, terraintexture);
- //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-
- gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
- */
-
- size=texture.sizeX;
-
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- heightmap[size-1-i][j]=(float)((texture.data[(i+(j*size))*texture.bpp/8]))/5;
- }
- }
-
- }
- if(visibleloading) Game::LoadingScreen();
-
- float slopeness;
-
- for(i=0;i<subdivision;i++){
- for(j=0;j<subdivision;j++){
- textureness[i][j]=-1;
- }
- }
- if(visibleloading) Game::LoadingScreen();
-
-
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- heightmap[i][j]*=.5;
-
- texoffsetx[i][j]=(float)abs(Random()%100)/1200/scale*3;
- texoffsety[i][j]=(float)abs(Random()%100)/1200/scale*3;
-
- slopeness=0;
- if(environment==snowyenvironment){
- if(j!=0&&heightmap[i][j]-heightmap[i][j-1]>slopeness){ slopeness=heightmap[i][j]-heightmap[i][j-1];}
- opacityother[i][j]=slopeness*slopeness*2;
- if(opacityother[i][j]>1)opacityother[i][j]=1;
- opacityother[i][j]-=(float)abs(Random()%100)/300;
- }
- if(environment==desertenvironment){
- if(j!=0&&heightmap[i][j]-heightmap[i][j-1]>slopeness){ slopeness=heightmap[i][j]-heightmap[i][j-1];}
- opacityother[i][j]=slopeness*slopeness*2;
- if(opacityother[i][j]>1)opacityother[i][j]=1;
- opacityother[i][j]-=(float)abs(Random()%100)/300;
- }
- if(environment==grassyenvironment){
- if(i!=0&&heightmap[i][j]-heightmap[i-1][j]>slopeness){ slopeness=heightmap[i][j]-heightmap[i-1][j];}
- if(j!=0&&heightmap[i][j]-heightmap[i][j-1]>slopeness){ slopeness=heightmap[i][j]-heightmap[i][j-1];}
- if(i<size-1&&heightmap[i][j]-heightmap[i+1][j]>slopeness){ slopeness=heightmap[i][j]-heightmap[i+1][j];}
- if(j<size-1&&heightmap[i][j]-heightmap[i][j+1]>slopeness){ slopeness=heightmap[i][j]-heightmap[i][j+1];}
- opacityother[i][j]=slopeness*slopeness*10;
- if(opacityother[i][j]>1)opacityother[i][j]=1;
- opacityother[i][j]-=(float)abs(Random()%100)/100;
- }
- }
- }
- if(visibleloading) Game::LoadingScreen();
-
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- if(environment==snowyenvironment){
- heightmap[i][j]-=opacityother[i][j];
- }
- if(environment==desertenvironment){
- heightmap[i][j]-=opacityother[i][j];
- }
- }
- }
- if(visibleloading) Game::LoadingScreen();
-
- /*float total;
- int todivide;
- //Smooth opacityother
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- total=0;
- todivide=0;
- if(i!=0){ total+=opacityother[j][i-1]; todivide++;}
- if(i!=size-1){ total+=opacityother[j][i+1]; todivide++;}
- if(j!=0){ total+=opacityother[j-1][i]; todivide++;}
- if(j!=size-1){ total+=opacityother[j+1][i]; todivide++;}
- if(i!=0&&j!=0){ total+=opacityother[j-1][i-1]; todivide++;}
- if(i!=size-1&&j!=0){ total+=opacityother[j-1][i+1]; todivide++;}
- if(j!=size-1&&i!=size-1){ total+=opacityother[j+1][i+1]; todivide++;}
- if(j!=size-1&&i!=0){ total+=opacityother[j+1][i-1]; todivide++;}
- total+=opacityother[j][i]; todivide++;
-
- opacityother[j][i]=total/(float)todivide;
- }
- }*/
-
-
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- if(opacityother[i][j]<.1)opacityother[i][j]=0;
- if(textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==-1){
- if(!opacityother[i][j])textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=allfirst;
- if(opacityother[i][j]==1)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=allsecond;
- }
- if(opacityother[i][j]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-
- x=i;
- y=j;
- if(i>0){
- i--;
- if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-
- if(j>0){
- j--;
- if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- j++;
- }
-
- if(j<size-1){
- j++;
- if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- j--;
- }
- i++;
- }
-
- if(i<size-1){
- i++;
- if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-
- if(j>0){
- j--;
- if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- j++;
- }
-
- if(j<size-1){
- j++;
- if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- j--;
- }
- i--;
- }
-
- if(j>0){
- j--;
- if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- j++;
- }
-
- if(j<size-1){
- j++;
- if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
- if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
- j--;
-
- }
- }
- }
- if(visibleloading) Game::LoadingScreen();
-
- patch_size=size/subdivision;
- patch_elements=(patch_size)*(patch_size)*54;
- CalculateNormals();
- /*DoShadows();
-
- for(i=0;i<subdivision;i++){
- for(j=0;j<subdivision;j++){
- UpdateVertexArray(i,j);
- }
- }*/
-
- return 1;
+ static long i, j;
+ static long x, y;
+ static float patch_size;
+
+ float temptexdetail = texdetail;
+ //LoadTGA( fileName );
+
+ // Fixing filename so that it works with its own os
+ char * FixedFN = ConvertFileName(fileName);
+
+ unsigned char fileNamep[256];
+ CopyCStringToPascal(FixedFN, fileNamep);
+ //Load Image
+ upload_image( fileNamep , 0);
+
+ //Is it valid?
+ if (texture.bpp > 24) {
+ int bytesPerPixel = texture.bpp / 8;
+
+ int tempnum = 0;
+ for (i = 0; i < (long)(texture.sizeY * texture.sizeX * bytesPerPixel); i++) {
+ if ((i + 1) % 4) {
+ texture.data[tempnum] = texture.data[i];
+ tempnum++;
+ }
+ }
+ }
+ texture.bpp = 24;
+ if (visibleloading) Game::LoadingScreen();
+
+ texdetail = temptexdetail;
+
+ size = 128;
+ if (1 == 1) {
+ /*if ( texture.bpp == 24 )
+ type = GL_RGB;
+ else
+ type = GL_RGBA;
+
+ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+
+ if(!terraintexture)glGenTextures( 1, &terraintexture );
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+
+ glBindTexture( GL_TEXTURE_2D, terraintexture);
+ //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+
+ gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
+ */
+
+ size = texture.sizeX;
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ heightmap[size - 1 - i][j] = (float)((texture.data[(i + (j * size)) * texture.bpp / 8])) / 5;
+ }
+ }
+
+ }
+ if (visibleloading) Game::LoadingScreen();
+
+ float slopeness;
+
+ for (i = 0; i < subdivision; i++) {
+ for (j = 0; j < subdivision; j++) {
+ textureness[i][j] = -1;
+ }
+ }
+ if (visibleloading) Game::LoadingScreen();
+
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ heightmap[i][j] *= .5;
+
+ texoffsetx[i][j] = (float)abs(Random() % 100) / 1200 / scale * 3;
+ texoffsety[i][j] = (float)abs(Random() % 100) / 1200 / scale * 3;
+
+ slopeness = 0;
+ if (environment == snowyenvironment) {
+ if (j != 0 && heightmap[i][j] - heightmap[i][j - 1] > slopeness) {
+ slopeness = heightmap[i][j] - heightmap[i][j - 1];
+ }
+ opacityother[i][j] = slopeness * slopeness * 2;
+ if (opacityother[i][j] > 1)opacityother[i][j] = 1;
+ opacityother[i][j] -= (float)abs(Random() % 100) / 300;
+ }
+ if (environment == desertenvironment) {
+ if (j != 0 && heightmap[i][j] - heightmap[i][j - 1] > slopeness) {
+ slopeness = heightmap[i][j] - heightmap[i][j - 1];
+ }
+ opacityother[i][j] = slopeness * slopeness * 2;
+ if (opacityother[i][j] > 1)opacityother[i][j] = 1;
+ opacityother[i][j] -= (float)abs(Random() % 100) / 300;
+ }
+ if (environment == grassyenvironment) {
+ if (i != 0 && heightmap[i][j] - heightmap[i - 1][j] > slopeness) {
+ slopeness = heightmap[i][j] - heightmap[i - 1][j];
+ }
+ if (j != 0 && heightmap[i][j] - heightmap[i][j - 1] > slopeness) {
+ slopeness = heightmap[i][j] - heightmap[i][j - 1];
+ }
+ if (i < size - 1 && heightmap[i][j] - heightmap[i + 1][j] > slopeness) {
+ slopeness = heightmap[i][j] - heightmap[i + 1][j];
+ }
+ if (j < size - 1 && heightmap[i][j] - heightmap[i][j + 1] > slopeness) {
+ slopeness = heightmap[i][j] - heightmap[i][j + 1];
+ }
+ opacityother[i][j] = slopeness * slopeness * 10;
+ if (opacityother[i][j] > 1)opacityother[i][j] = 1;
+ opacityother[i][j] -= (float)abs(Random() % 100) / 100;
+ }
+ }
+ }
+ if (visibleloading) Game::LoadingScreen();
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ if (environment == snowyenvironment) {
+ heightmap[i][j] -= opacityother[i][j];
+ }
+ if (environment == desertenvironment) {
+ heightmap[i][j] -= opacityother[i][j];
+ }
+ }
+ }
+ if (visibleloading) Game::LoadingScreen();
+
+ /*float total;
+ int todivide;
+ //Smooth opacityother
+ for(i=0;i<size;i++){
+ for(j=0;j<size;j++){
+ total=0;
+ todivide=0;
+ if(i!=0){ total+=opacityother[j][i-1]; todivide++;}
+ if(i!=size-1){ total+=opacityother[j][i+1]; todivide++;}
+ if(j!=0){ total+=opacityother[j-1][i]; todivide++;}
+ if(j!=size-1){ total+=opacityother[j+1][i]; todivide++;}
+ if(i!=0&&j!=0){ total+=opacityother[j-1][i-1]; todivide++;}
+ if(i!=size-1&&j!=0){ total+=opacityother[j-1][i+1]; todivide++;}
+ if(j!=size-1&&i!=size-1){ total+=opacityother[j+1][i+1]; todivide++;}
+ if(j!=size-1&&i!=0){ total+=opacityother[j+1][i-1]; todivide++;}
+ total+=opacityother[j][i]; todivide++;
+
+ opacityother[j][i]=total/(float)todivide;
+ }
+ }*/
+
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ if (opacityother[i][j] < .1)opacityother[i][j] = 0;
+ if (textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == -1) {
+ if (!opacityother[i][j])textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = allfirst;
+ if (opacityother[i][j] == 1)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = allsecond;
+ }
+ if (opacityother[i][j] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+
+ x = i;
+ y = j;
+ if (i > 0) {
+ i--;
+ if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+
+ if (j > 0) {
+ j--;
+ if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ j++;
+ }
+
+ if (j < size - 1) {
+ j++;
+ if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ j--;
+ }
+ i++;
+ }
+
+ if (i < size - 1) {
+ i++;
+ if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+
+ if (j > 0) {
+ j--;
+ if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ j++;
+ }
+
+ if (j < size - 1) {
+ j++;
+ if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ j--;
+ }
+ i--;
+ }
+
+ if (j > 0) {
+ j--;
+ if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ j++;
+ }
+
+ if (j < size - 1) {
+ j++;
+ if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+ if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+ j--;
+
+ }
+ }
+ }
+ if (visibleloading) Game::LoadingScreen();
+
+ patch_size = size / subdivision;
+ patch_elements = (patch_size) * (patch_size) * 54;
+ CalculateNormals();
+ /*DoShadows();
+
+ for(i=0;i<subdivision;i++){
+ for(j=0;j<subdivision;j++){
+ UpdateVertexArray(i,j);
+ }
+ }*/
+
+ return 1;
}
void Terrain::CalculateNormals()
{
- static int i,j;
- static XYZ facenormal;
- static XYZ p,q,a,b,c;
-
- for(i=0; i<size; i++){
- for(j=0; j<size; j++){
- normals[i][j].x=0;
- normals[i][j].y=0;
- normals[i][j].z=0;
- }
- }
-
- for(i=0;i<size-1;i++){
- for(j=0;j<size-1;j++){
- a.x=i;
- a.y=heightmap[i][j];
- a.z=j;
- b.x=i;
- b.y=heightmap[i][j+1];
- b.z=j+1;
- c.x=i+1;
- c.y=heightmap[i+1][j];
- c.z=j;
-
- p.x=b.x-a.x;
- p.y=b.y-a.y;
- p.z=b.z-a.z;
- q.x=c.x-a.x;
- q.y=c.y-a.y;
- q.z=c.z-a.z;
-
- CrossProduct(&p,&q,&facenormal);
-
- facenormals[i][j]=facenormal;
-
- normals[i][j]=normals[i][j]+facenormal;
- normals[i][j+1]=normals[i][j+1]+facenormal;
- normals[i+1][j]=normals[i+1][j]+facenormal;
-
-
- a.x=i+1;
- a.y=heightmap[i+1][j];
- a.z=j;
- b.x=i;
- b.y=heightmap[i][j+1];
- b.z=j+1;
- c.x=i+1;
- c.y=heightmap[i+1][j+1];
- c.z=j+1;
-
- p.x=b.x-a.x;
- p.y=b.y-a.y;
- p.z=b.z-a.z;
- q.x=c.x-a.x;
- q.y=c.y-a.y;
- q.z=c.z-a.z;
-
- CrossProduct(&p,&q,&facenormal);
-
- normals[i+1][j+1]=normals[i+1][j+1]+facenormal;
- normals[i][j+1]=normals[i][j+1]+facenormal;
- normals[i+1][j]=normals[i+1][j]+facenormal;
-
- Normalise(&facenormals[i][j]);
- }
- }
-
- for(i=0; i<size; i++){
- for(j=0; j<size; j++){
- Normalise(&normals[i][j]);
- normals[i][j]=normals[i][j];
- }
- }
+ static int i, j;
+ static XYZ facenormal;
+ static XYZ p, q, a, b, c;
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ normals[i][j].x = 0;
+ normals[i][j].y = 0;
+ normals[i][j].z = 0;
+ }
+ }
+
+ for (i = 0; i < size - 1; i++) {
+ for (j = 0; j < size - 1; j++) {
+ a.x = i;
+ a.y = heightmap[i][j];
+ a.z = j;
+ b.x = i;
+ b.y = heightmap[i][j + 1];
+ b.z = j + 1;
+ c.x = i + 1;
+ c.y = heightmap[i + 1][j];
+ c.z = j;
+
+ p.x = b.x - a.x;
+ p.y = b.y - a.y;
+ p.z = b.z - a.z;
+ q.x = c.x - a.x;
+ q.y = c.y - a.y;
+ q.z = c.z - a.z;
+
+ CrossProduct(&p, &q, &facenormal);
+
+ facenormals[i][j] = facenormal;
+
+ normals[i][j] = normals[i][j] + facenormal;
+ normals[i][j + 1] = normals[i][j + 1] + facenormal;
+ normals[i + 1][j] = normals[i + 1][j] + facenormal;
+
+
+ a.x = i + 1;
+ a.y = heightmap[i + 1][j];
+ a.z = j;
+ b.x = i;
+ b.y = heightmap[i][j + 1];
+ b.z = j + 1;
+ c.x = i + 1;
+ c.y = heightmap[i + 1][j + 1];
+ c.z = j + 1;
+
+ p.x = b.x - a.x;
+ p.y = b.y - a.y;
+ p.z = b.z - a.z;
+ q.x = c.x - a.x;
+ q.y = c.y - a.y;
+ q.z = c.z - a.z;
+
+ CrossProduct(&p, &q, &facenormal);
+
+ normals[i + 1][j + 1] = normals[i + 1][j + 1] + facenormal;
+ normals[i][j + 1] = normals[i][j + 1] + facenormal;
+ normals[i + 1][j] = normals[i + 1][j] + facenormal;
+
+ Normalise(&facenormals[i][j]);
+ }
+ }
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ Normalise(&normals[i][j]);
+ normals[i][j] = normals[i][j];
+ }
+ }
}
-void Terrain::drawpatch(int whichx, int whichy, float opacity){
- if(opacity>=1)glDisable(GL_BLEND);
- if(opacity<1){
- glEnable(GL_BLEND);
- UpdateTransparency(whichx,whichy);
- }
- glColor4f(1,1,1,1);
- //Set up vertex array
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glVertexPointer(3, GL_FLOAT, 9*sizeof(GLfloat),&vArray[0+whichx*patch_elements+whichy*patch_elements*subdivision]);
- glColorPointer(4,GL_FLOAT, 9*sizeof(GLfloat),&vArray[3+whichx*patch_elements+whichy*patch_elements*subdivision]);
- glTexCoordPointer(2, GL_FLOAT, 9*sizeof(GLfloat),&vArray[7+whichx*patch_elements+whichy*patch_elements*subdivision]);
-
- //Draw
- glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy]*3);
-
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+void Terrain::drawpatch(int whichx, int whichy, float opacity)
+{
+ if (opacity >= 1)glDisable(GL_BLEND);
+ if (opacity < 1) {
+ glEnable(GL_BLEND);
+ UpdateTransparency(whichx, whichy);
+ }
+ glColor4f(1, 1, 1, 1);
+ //Set up vertex array
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[0 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+ glColorPointer(4, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[3 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+ glTexCoordPointer(2, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[7 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+
+ //Draw
+ glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy] * 3);
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
-void Terrain::drawpatchother(int whichx, int whichy, float opacity){
- glEnable(GL_BLEND);
- if(opacity<1){
- UpdateTransparency(whichx,whichy);
- }
- UpdateTransparencyother(whichx,whichy);
- glColor4f(1,1,1,1);
- //Set up vertex array
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glVertexPointer(3, GL_FLOAT, 9*sizeof(GLfloat),&vArray[0+whichx*patch_elements+whichy*patch_elements*subdivision]);
- glColorPointer(4,GL_FLOAT, 9*sizeof(GLfloat),&vArray[3+whichx*patch_elements+whichy*patch_elements*subdivision]);
- glTexCoordPointer(2, GL_FLOAT, 9*sizeof(GLfloat),&vArray[7+whichx*patch_elements+whichy*patch_elements*subdivision]);
-
- //Draw
- glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy]*3);
-
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+void Terrain::drawpatchother(int whichx, int whichy, float opacity)
+{
+ glEnable(GL_BLEND);
+ if (opacity < 1) {
+ UpdateTransparency(whichx, whichy);
+ }
+ UpdateTransparencyother(whichx, whichy);
+ glColor4f(1, 1, 1, 1);
+ //Set up vertex array
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[0 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+ glColorPointer(4, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[3 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+ glTexCoordPointer(2, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[7 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+
+ //Draw
+ glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy] * 3);
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
-void Terrain::drawpatchotherother(int whichx, int whichy, float opacity){
- glEnable(GL_BLEND);
- UpdateTransparencyotherother(whichx,whichy);
+void Terrain::drawpatchotherother(int whichx, int whichy, float opacity)
+{
+ glEnable(GL_BLEND);
+ UpdateTransparencyotherother(whichx, whichy);
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glScalef(6, 6, 6);
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glScalef(6, 6, 6);
- glColor4f(1,1,1,1);
+ glColor4f(1, 1, 1, 1);
- //Set up vertex array
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glVertexPointer(3, GL_FLOAT, 9*sizeof(GLfloat),&vArray[0+whichx*patch_elements+whichy*patch_elements*subdivision]);
- glColorPointer(4,GL_FLOAT, 9*sizeof(GLfloat),&vArray[3+whichx*patch_elements+whichy*patch_elements*subdivision]);
- glTexCoordPointer(2, GL_FLOAT, 9*sizeof(GLfloat),&vArray[7+whichx*patch_elements+whichy*patch_elements*subdivision]);
+ //Set up vertex array
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[0 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+ glColorPointer(4, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[3 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+ glTexCoordPointer(2, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[7 + whichx * patch_elements + whichy * patch_elements * subdivision]);
- //Draw
- glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy]*3);
+ //Draw
+ glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy] * 3);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
}
float Terrain::getHeight(float pointx, float pointz)
{
- static float height1,height2;
- static int tilex,tiley;
- static XYZ startpoint,endpoint,intersect,triangle[3],average;
+ static float height1, height2;
+ static int tilex, tiley;
+ static XYZ startpoint, endpoint, intersect, triangle[3], average;
- pointx/=scale;
- pointz/=scale;
+ pointx /= scale;
+ pointz /= scale;
- if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return 0;
+ if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return 0;
- startpoint.x=pointx;
- startpoint.y=-1000;
- startpoint.z=pointz;
+ startpoint.x = pointx;
+ startpoint.y = -1000;
+ startpoint.z = pointz;
- endpoint=startpoint;
- endpoint.y=1000;
+ endpoint = startpoint;
+ endpoint.y = 1000;
- tilex=pointx;
- tiley=pointz;
+ tilex = pointx;
+ tiley = pointz;
- triangle[0].x=tilex;
- triangle[0].z=tiley;
- triangle[0].y=heightmap[tilex][tiley];
+ triangle[0].x = tilex;
+ triangle[0].z = tiley;
+ triangle[0].y = heightmap[tilex][tiley];
- triangle[1].x=tilex+1;
- triangle[1].z=tiley;
- triangle[1].y=heightmap[tilex+1][tiley];
+ triangle[1].x = tilex + 1;
+ triangle[1].z = tiley;
+ triangle[1].y = heightmap[tilex + 1][tiley];
- triangle[2].x=tilex;
- triangle[2].z=tiley+1;
- triangle[2].y=heightmap[tilex][tiley+1];
+ triangle[2].x = tilex;
+ triangle[2].z = tiley + 1;
+ triangle[2].y = heightmap[tilex][tiley + 1];
- if(!LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect)){
- triangle[0].x=tilex+1;
- triangle[0].z=tiley;
- triangle[0].y=heightmap[tilex+1][tiley];
+ if (!LineFacetd(&startpoint, &endpoint, &triangle[0], &triangle[1], &triangle[2], &intersect)) {
+ triangle[0].x = tilex + 1;
+ triangle[0].z = tiley;
+ triangle[0].y = heightmap[tilex + 1][tiley];
- triangle[1].x=tilex+1;
- triangle[1].z=tiley+1;
- triangle[1].y=heightmap[tilex+1][tiley+1];
+ triangle[1].x = tilex + 1;
+ triangle[1].z = tiley + 1;
+ triangle[1].y = heightmap[tilex + 1][tiley + 1];
- triangle[2].x=tilex;
- triangle[2].z=tiley+1;
- triangle[2].y=heightmap[tilex][tiley+1];
- LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect);
- }
- return intersect.y*scale+getOpacity(pointx*scale,pointz*scale)/8;
+ triangle[2].x = tilex;
+ triangle[2].z = tiley + 1;
+ triangle[2].y = heightmap[tilex][tiley + 1];
+ LineFacetd(&startpoint, &endpoint, &triangle[0], &triangle[1], &triangle[2], &intersect);
+ }
+ return intersect.y * scale + getOpacity(pointx * scale, pointz * scale) / 8;
- //height1=heightmap[tilex][tiley]*(1-(pointx-tilex))+heightmap[tilex+1][tiley]*(pointx-tilex);
- //height2=heightmap[tilex][tiley+1]*(1-(pointx-tilex))+heightmap[tilex+1][tiley+1]*(pointx-tilex);
+ //height1=heightmap[tilex][tiley]*(1-(pointx-tilex))+heightmap[tilex+1][tiley]*(pointx-tilex);
+ //height2=heightmap[tilex][tiley+1]*(1-(pointx-tilex))+heightmap[tilex+1][tiley+1]*(pointx-tilex);
- //return height1*(1-(pointz-tiley))*scale+height2*(pointz-tiley)*scale;
+ //return height1*(1-(pointz-tiley))*scale+height2*(pointz-tiley)*scale;
}
-float Terrain::getHeightExtrude(float pointx, float pointz,float point2x, float point2z)
+float Terrain::getHeightExtrude(float pointx, float pointz, float point2x, float point2z)
{
- static float height1,height2;
- static int tilex,tiley;
- static XYZ startpoint,endpoint,intersect,triangle[3],average;
+ static float height1, height2;
+ static int tilex, tiley;
+ static XYZ startpoint, endpoint, intersect, triangle[3], average;
- pointx/=scale;
- pointz/=scale;
- point2x/=scale;
- point2z/=scale;
+ pointx /= scale;
+ pointz /= scale;
+ point2x /= scale;
+ point2z /= scale;
- if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return 0;
- if(point2x>=size-1||point2z>=size-1||point2x<=0||point2z<=0)return 0;
+ if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return 0;
+ if (point2x >= size - 1 || point2z >= size - 1 || point2x <= 0 || point2z <= 0)return 0;
- startpoint.x=point2x;
- startpoint.y=-1000;
- startpoint.z=point2z;
+ startpoint.x = point2x;
+ startpoint.y = -1000;
+ startpoint.z = point2z;
- endpoint=startpoint;
- endpoint.y=1000;
+ endpoint = startpoint;
+ endpoint.y = 1000;
- tilex=pointx;
- tiley=pointz;
+ tilex = pointx;
+ tiley = pointz;
- triangle[0].x=tilex;
- triangle[0].z=tiley;
- triangle[0].y=heightmap[tilex][tiley];
+ triangle[0].x = tilex;
+ triangle[0].z = tiley;
+ triangle[0].y = heightmap[tilex][tiley];
- triangle[1].x=tilex+1;
- triangle[1].z=tiley;
- triangle[1].y=heightmap[tilex+1][tiley];
+ triangle[1].x = tilex + 1;
+ triangle[1].z = tiley;
+ triangle[1].y = heightmap[tilex + 1][tiley];
- triangle[2].x=tilex;
- triangle[2].z=tiley+1;
- triangle[2].y=heightmap[tilex][tiley+1];
+ triangle[2].x = tilex;
+ triangle[2].z = tiley + 1;
+ triangle[2].y = heightmap[tilex][tiley + 1];
- XYZ mid;
+ XYZ mid;
- mid=(triangle[0]+triangle[1]+triangle[2])/2;
+ mid = (triangle[0] + triangle[1] + triangle[2]) / 2;
- triangle[0]=mid+(triangle[0]-mid)*10;
- triangle[1]=mid+(triangle[0]-mid)*10;
- triangle[2]=mid+(triangle[0]-mid)*10;
+ triangle[0] = mid + (triangle[0] - mid) * 10;
+ triangle[1] = mid + (triangle[0] - mid) * 10;
+ triangle[2] = mid + (triangle[0] - mid) * 10;
- /*
- if(!LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect)){
- triangle[0].x=tilex+1;
- triangle[0].z=tiley;
- triangle[0].y=heightmap[tilex+1][tiley];
+ /*
+ if(!LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect)){
+ triangle[0].x=tilex+1;
+ triangle[0].z=tiley;
+ triangle[0].y=heightmap[tilex+1][tiley];
- triangle[1].x=tilex+1;
- triangle[1].z=tiley+1;
- triangle[1].y=heightmap[tilex+1][tiley+1];
+ triangle[1].x=tilex+1;
+ triangle[1].z=tiley+1;
+ triangle[1].y=heightmap[tilex+1][tiley+1];
- triangle[2].x=tilex;
- triangle[2].z=tiley+1;
- triangle[2].y=heightmap[tilex][tiley+1];
- LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect);
- }*/
- return intersect.y*scale+getOpacity(pointx*scale,pointz*scale)/8;
+ triangle[2].x=tilex;
+ triangle[2].z=tiley+1;
+ triangle[2].y=heightmap[tilex][tiley+1];
+ LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect);
+ }*/
+ return intersect.y * scale + getOpacity(pointx * scale, pointz * scale) / 8;
- //height1=heightmap[tilex][tiley]*(1-(pointx-tilex))+heightmap[tilex+1][tiley]*(pointx-tilex);
- //height2=heightmap[tilex][tiley+1]*(1-(pointx-tilex))+heightmap[tilex+1][tiley+1]*(pointx-tilex);
+ //height1=heightmap[tilex][tiley]*(1-(pointx-tilex))+heightmap[tilex+1][tiley]*(pointx-tilex);
+ //height2=heightmap[tilex][tiley+1]*(1-(pointx-tilex))+heightmap[tilex+1][tiley+1]*(pointx-tilex);
- //return height1*(1-(pointz-tiley))*scale+height2*(pointz-tiley)*scale;
+ //return height1*(1-(pointz-tiley))*scale+height2*(pointz-tiley)*scale;
}
float Terrain::getOpacity(float pointx, float pointz)
{
- static float height1,height2;
- static int tilex,tiley;
+ static float height1, height2;
+ static int tilex, tiley;
- pointx/=scale;
- pointz/=scale;
+ pointx /= scale;
+ pointz /= scale;
- if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return 0;
+ if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return 0;
- tilex=pointx;
- tiley=pointz;
+ tilex = pointx;
+ tiley = pointz;
- height1=opacityother[tilex][tiley]*(1-(pointx-tilex))+opacityother[tilex+1][tiley]*(pointx-tilex);
- height2=opacityother[tilex][tiley+1]*(1-(pointx-tilex))+opacityother[tilex+1][tiley+1]*(pointx-tilex);
+ height1 = opacityother[tilex][tiley] * (1 - (pointx - tilex)) + opacityother[tilex + 1][tiley] * (pointx - tilex);
+ height2 = opacityother[tilex][tiley + 1] * (1 - (pointx - tilex)) + opacityother[tilex + 1][tiley + 1] * (pointx - tilex);
- return height1*(1-(pointz-tiley))+height2*(pointz-tiley);
+ return height1 * (1 - (pointz - tiley)) + height2 * (pointz - tiley);
}
XYZ Terrain::getNormal(float pointx, float pointz)
{
- static XYZ height1,height2,total;
- static int tilex,tiley;
-
- pointx/=scale;
- pointz/=scale;
-
- height1=0;
- if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return height1;
- tilex=pointx;
- tiley=pointz;
-
- height1=normals[tilex][tiley]*(1-(pointx-tilex))+normals[tilex+1][tiley]*(pointx-tilex);
- height2=normals[tilex][tiley+1]*(1-(pointx-tilex))+normals[tilex+1][tiley+1]*(pointx-tilex);
- total=height1*(1-(pointz-tiley))+height2*(pointz-tiley);
- Normalise(&total);
- return total;
+ static XYZ height1, height2, total;
+ static int tilex, tiley;
+
+ pointx /= scale;
+ pointz /= scale;
+
+ height1 = 0;
+ if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return height1;
+ tilex = pointx;
+ tiley = pointz;
+
+ height1 = normals[tilex][tiley] * (1 - (pointx - tilex)) + normals[tilex + 1][tiley] * (pointx - tilex);
+ height2 = normals[tilex][tiley + 1] * (1 - (pointx - tilex)) + normals[tilex + 1][tiley + 1] * (pointx - tilex);
+ total = height1 * (1 - (pointz - tiley)) + height2 * (pointz - tiley);
+ Normalise(&total);
+ return total;
}
XYZ Terrain::getLighting(float pointx, float pointz)
{
- static XYZ height1,height2;
- static int tilex,tiley;
+ static XYZ height1, height2;
+ static int tilex, tiley;
- pointx/=scale;
- pointz/=scale;
+ pointx /= scale;
+ pointz /= scale;
- height1=0;
- if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return height1;
- tilex=pointx;
- tiley=pointz;
+ height1 = 0;
+ if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return height1;
+ tilex = pointx;
+ tiley = pointz;
- height1.x=colors[tilex][tiley][0]*(1-(pointx-tilex))+colors[tilex+1][tiley][0]*(pointx-tilex);
- height1.y=colors[tilex][tiley][1]*(1-(pointx-tilex))+colors[tilex+1][tiley][1]*(pointx-tilex);
- height1.z=colors[tilex][tiley][2]*(1-(pointx-tilex))+colors[tilex+1][tiley][2]*(pointx-tilex);
- height2.x=colors[tilex][tiley+1][0]*(1-(pointx-tilex))+colors[tilex+1][tiley+1][0]*(pointx-tilex);
- height2.y=colors[tilex][tiley+1][1]*(1-(pointx-tilex))+colors[tilex+1][tiley+1][1]*(pointx-tilex);
- height2.z=colors[tilex][tiley+1][2]*(1-(pointx-tilex))+colors[tilex+1][tiley+1][2]*(pointx-tilex);
+ height1.x = colors[tilex][tiley][0] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley][0] * (pointx - tilex);
+ height1.y = colors[tilex][tiley][1] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley][1] * (pointx - tilex);
+ height1.z = colors[tilex][tiley][2] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley][2] * (pointx - tilex);
+ height2.x = colors[tilex][tiley + 1][0] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley + 1][0] * (pointx - tilex);
+ height2.y = colors[tilex][tiley + 1][1] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley + 1][1] * (pointx - tilex);
+ height2.z = colors[tilex][tiley + 1][2] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley + 1][2] * (pointx - tilex);
- return height1*(1-(pointz-tiley))+height2*(pointz-tiley);
+ return height1 * (1 - (pointz - tiley)) + height2 * (pointz - tiley);
}
void Terrain::draw(int layer)
{
- static int i,j;
- static float opacity;
- static XYZ terrainpoint;
- static float distance[subdivision][subdivision];
-
- static int beginx,endx;
- static int beginz,endz;
-
- static float patch_size=size/subdivision*scale;
- static float viewdistsquared;
-
- viewdistsquared=viewdistance*viewdistance;
-
- //Only nearby blocks
- beginx=(viewer.x-viewdistance)/(patch_size)-1;
- if(beginx<0)beginx=0;
- beginz=(viewer.z-viewdistance)/(patch_size)-1;
- if(beginz<0)beginz=0;
-
- endx=(viewer.x+viewdistance)/(patch_size)+1;
- if(endx>subdivision)endx=subdivision;
- endz=(viewer.z+viewdistance)/(patch_size)+1;
- if(endz>subdivision)endz=subdivision;
-
- if(!layer) {
- for(i=beginx;i<endx;i++){
- for(j=beginz;j<endz;j++){
- terrainpoint.x=i*patch_size+(patch_size)/2;
- terrainpoint.y=viewer.y;//heightmap[i][j]*scale;
- terrainpoint.z=j*patch_size+(patch_size)/2;
- distance[i][j]=distsq(&viewer,&terrainpoint);
- }
- }
- }
- for(i=beginx;i<endx;i++){
- for(j=beginz;j<endz;j++){
- if(distance[i][j]<(viewdistance+patch_size)*(viewdistance+patch_size)){
- opacity=1;
- if(distance[i][j]>viewdistsquared*fadestart-viewdistsquared)
- opacity=0;
- if(opacity==1&&i!=subdivision)
- if(distance[i+1][j]>viewdistsquared*fadestart-viewdistsquared)
- opacity=0;
- if(opacity==1&&j!=subdivision)
- if(distance[i][j+1]>viewdistsquared*fadestart-viewdistsquared)
- opacity=0;
- if(opacity==1&&j!=subdivision&&i!=subdivision)
- if(distance[i+1][j+1]>viewdistsquared*fadestart-viewdistsquared)
- opacity=0;
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- if(frustum.CubeInFrustum(i*patch_size+patch_size*.5,avgypatch[i][j],j*patch_size+patch_size*.5,heightypatch[i][j]/2))
- {
- if(environment==desertenvironment&&distance[i][j]>viewdistsquared/4)
- glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness);
- else if(environment==desertenvironment)
- glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
- if(!layer&&textureness[i][j]!=allsecond)
- drawpatch(i,j,opacity);
- if(layer==1&&textureness[i][j]!=allfirst)
- drawpatchother(i,j,opacity);
- if(layer==2&&textureness[i][j]!=allfirst)
- drawpatchotherother(i,j,opacity);
- }
- glPopMatrix();
- }
- }
- }
- if(environment==desertenvironment)
- glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+ static int i, j;
+ static float opacity;
+ static XYZ terrainpoint;
+ static float distance[subdivision][subdivision];
+
+ static int beginx, endx;
+ static int beginz, endz;
+
+ static float patch_size = size / subdivision * scale;
+ static float viewdistsquared;
+
+ viewdistsquared = viewdistance * viewdistance;
+
+ //Only nearby blocks
+ beginx = (viewer.x - viewdistance) / (patch_size) - 1;
+ if (beginx < 0)beginx = 0;
+ beginz = (viewer.z - viewdistance) / (patch_size) - 1;
+ if (beginz < 0)beginz = 0;
+
+ endx = (viewer.x + viewdistance) / (patch_size) + 1;
+ if (endx > subdivision)endx = subdivision;
+ endz = (viewer.z + viewdistance) / (patch_size) + 1;
+ if (endz > subdivision)endz = subdivision;
+
+ if (!layer) {
+ for (i = beginx; i < endx; i++) {
+ for (j = beginz; j < endz; j++) {
+ terrainpoint.x = i * patch_size + (patch_size) / 2;
+ terrainpoint.y = viewer.y; //heightmap[i][j]*scale;
+ terrainpoint.z = j * patch_size + (patch_size) / 2;
+ distance[i][j] = distsq(&viewer, &terrainpoint);
+ }
+ }
+ }
+ for (i = beginx; i < endx; i++) {
+ for (j = beginz; j < endz; j++) {
+ if (distance[i][j] < (viewdistance + patch_size) * (viewdistance + patch_size)) {
+ opacity = 1;
+ if (distance[i][j] > viewdistsquared * fadestart - viewdistsquared)
+ opacity = 0;
+ if (opacity == 1 && i != subdivision)
+ if (distance[i + 1][j] > viewdistsquared * fadestart - viewdistsquared)
+ opacity = 0;
+ if (opacity == 1 && j != subdivision)
+ if (distance[i][j + 1] > viewdistsquared * fadestart - viewdistsquared)
+ opacity = 0;
+ if (opacity == 1 && j != subdivision && i != subdivision)
+ if (distance[i + 1][j + 1] > viewdistsquared * fadestart - viewdistsquared)
+ opacity = 0;
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ if (frustum.CubeInFrustum(i * patch_size + patch_size * .5, avgypatch[i][j], j * patch_size + patch_size * .5, heightypatch[i][j] / 2)) {
+ if (environment == desertenvironment && distance[i][j] > viewdistsquared / 4)
+ glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness);
+ else if (environment == desertenvironment)
+ glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+ if (!layer && textureness[i][j] != allsecond)
+ drawpatch(i, j, opacity);
+ if (layer == 1 && textureness[i][j] != allfirst)
+ drawpatchother(i, j, opacity);
+ if (layer == 2 && textureness[i][j] != allfirst)
+ drawpatchotherother(i, j, opacity);
+ }
+ glPopMatrix();
+ }
+ }
+ }
+ if (environment == desertenvironment)
+ glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
}
void Terrain::drawdecals()
{
- if(decals) {
- static int i,j;
- static float distancemult;
- static int lasttype;
-
- static float patch_size=size/subdivision*scale;
- static float viewdistsquared;
- static bool blend;
-
- viewdistsquared=viewdistance*viewdistance;
- blend=1;
-
- lasttype=-1;
- glEnable(GL_BLEND);
- glDisable(GL_LIGHTING);
- glDisable(GL_CULL_FACE);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glDepthMask(0);
- for(i=0;i<numdecals;i++){
- if(decaltype[i]==blooddecalfast&&decalalivetime[i]<2)decalalivetime[i]=2;
- if((decaltype[i]==shadowdecal||decaltype[i]==shadowdecalpermanent)&&decaltype[i]!=lasttype){
- shadowtexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- }
- if(decaltype[i]==footprintdecal&&decaltype[i]!=lasttype){
- footprinttexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- }
- if(decaltype[i]==bodyprintdecal&&decaltype[i]!=lasttype){
- bodyprinttexture.bind();
- if(!blend){
- blend=1;
- glAlphaFunc(GL_GREATER, 0.0001);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- }
- }
- if((decaltype[i]==blooddecal||decaltype[i]==blooddecalslow)&&decaltype[i]!=lasttype){
- bloodtexture.bind();
- if(blend){
- blend=0;
- glAlphaFunc(GL_GREATER, 0.15);
- glBlendFunc(GL_ONE,GL_ZERO);
- }
- }
- if((decaltype[i]==blooddecalfast)&&decaltype[i]!=lasttype){
- bloodtexture2.bind();
- if(blend){
- blend=0;
- glAlphaFunc(GL_GREATER, 0.15);
- glBlendFunc(GL_ONE,GL_ZERO);
- }
- }
- if(decaltype[i]==shadowdecal||decaltype[i]==shadowdecalpermanent){
- distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
- if(distancemult>=1)glColor4f(1,1,1,decalopacity[i]);
- if(distancemult<1)glColor4f(1,1,1,decalopacity[i]*distancemult);
- }
- if(decaltype[i]==footprintdecal||decaltype[i]==bodyprintdecal){
- distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
- if(distancemult>=1){
- glColor4f(1,1,1,decalopacity[i]);
- if(decalalivetime[i]>3)glColor4f(1,1,1,decalopacity[i]*(5-decalalivetime[i])/2);
- }
- if(distancemult<1){
- glColor4f(1,1,1,decalopacity[i]*distancemult);
- if(decalalivetime[i]>3)glColor4f(1,1,1,decalopacity[i]*(5-decalalivetime[i])/2*distancemult);
- }
- }
- if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)){
- distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
- if(distancemult>=1){
- glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]);
- if(decalalivetime[i]<4)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*decalalivetime[i]*.25);
- if(decalalivetime[i]>58)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*(60-decalalivetime[i])/2);
- }
- if(distancemult<1){
- glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*distancemult);
- if(decalalivetime[i]<4)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*decalalivetime[i]*distancemult*.25);
- if(decalalivetime[i]>58)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*(60-decalalivetime[i])/2*distancemult);
- }
- }
- lasttype=decaltype[i];
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- glBegin(GL_TRIANGLES);
- for(int j=0;j<3;j++)
- {
- glTexCoord2f(decaltexcoords[i][j][0], decaltexcoords[i][j][1]); glVertex3f(decalvertex[i][j].x,decalvertex[i][j].y,decalvertex[i][j].z);
- }
- glEnd();
- glPopMatrix();
- }
- for(i=numdecals-1;i>=0;i--){
- decalalivetime[i]+=multiplier;
- if(decaltype[i]==blooddecalslow)decalalivetime[i]-=multiplier*2/3;
- if(decaltype[i]==blooddecalfast)decalalivetime[i]+=multiplier*4;
- if(decaltype[i]==shadowdecal)DeleteDecal(i);
- if(decaltype[i]==footprintdecal&&decalalivetime[i]>=5)DeleteDecal(i);
- if(decaltype[i]==bodyprintdecal&&decalalivetime[i]>=5)DeleteDecal(i);
- if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)&&decalalivetime[i]>=60)DeleteDecal(i);
- }
- glAlphaFunc(GL_GREATER, 0.0001);
- }
+ if (decals) {
+ static int i, j;
+ static float distancemult;
+ static int lasttype;
+
+ static float patch_size = size / subdivision * scale;
+ static float viewdistsquared;
+ static bool blend;
+
+ viewdistsquared = viewdistance * viewdistance;
+ blend = 1;
+
+ lasttype = -1;
+ glEnable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_CULL_FACE);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDepthMask(0);
+ for (i = 0; i < numdecals; i++) {
+ if (decaltype[i] == blooddecalfast && decalalivetime[i] < 2)decalalivetime[i] = 2;
+ if ((decaltype[i] == shadowdecal || decaltype[i] == shadowdecalpermanent) && decaltype[i] != lasttype) {
+ shadowtexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ }
+ if (decaltype[i] == footprintdecal && decaltype[i] != lasttype) {
+ footprinttexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ }
+ if (decaltype[i] == bodyprintdecal && decaltype[i] != lasttype) {
+ bodyprinttexture.bind();
+ if (!blend) {
+ blend = 1;
+ glAlphaFunc(GL_GREATER, 0.0001);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ }
+ if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalslow) && decaltype[i] != lasttype) {
+ bloodtexture.bind();
+ if (blend) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.15);
+ glBlendFunc(GL_ONE, GL_ZERO);
+ }
+ }
+ if ((decaltype[i] == blooddecalfast) && decaltype[i] != lasttype) {
+ bloodtexture2.bind();
+ if (blend) {
+ blend = 0;
+ glAlphaFunc(GL_GREATER, 0.15);
+ glBlendFunc(GL_ONE, GL_ZERO);
+ }
+ }
+ if (decaltype[i] == shadowdecal || decaltype[i] == shadowdecalpermanent) {
+ distancemult = (viewdistsquared - (distsq(&viewer, &decalposition[i]) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+ if (distancemult >= 1)glColor4f(1, 1, 1, decalopacity[i]);
+ if (distancemult < 1)glColor4f(1, 1, 1, decalopacity[i]*distancemult);
+ }
+ if (decaltype[i] == footprintdecal || decaltype[i] == bodyprintdecal) {
+ distancemult = (viewdistsquared - (distsq(&viewer, &decalposition[i]) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+ if (distancemult >= 1) {
+ glColor4f(1, 1, 1, decalopacity[i]);
+ if (decalalivetime[i] > 3)glColor4f(1, 1, 1, decalopacity[i] * (5 - decalalivetime[i]) / 2);
+ }
+ if (distancemult < 1) {
+ glColor4f(1, 1, 1, decalopacity[i]*distancemult);
+ if (decalalivetime[i] > 3)glColor4f(1, 1, 1, decalopacity[i] * (5 - decalalivetime[i]) / 2 * distancemult);
+ }
+ }
+ if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow)) {
+ distancemult = (viewdistsquared - (distsq(&viewer, &decalposition[i]) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+ if (distancemult >= 1) {
+ glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i]);
+ if (decalalivetime[i] < 4)glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i]*decalalivetime[i]*.25);
+ if (decalalivetime[i] > 58)glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i] * (60 - decalalivetime[i]) / 2);
+ }
+ if (distancemult < 1) {
+ glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i]*distancemult);
+ if (decalalivetime[i] < 4)glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i]*decalalivetime[i]*distancemult * .25);
+ if (decalalivetime[i] > 58)glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i] * (60 - decalalivetime[i]) / 2 * distancemult);
+ }
+ }
+ lasttype = decaltype[i];
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ glBegin(GL_TRIANGLES);
+ for (int j = 0; j < 3; j++) {
+ glTexCoord2f(decaltexcoords[i][j][0], decaltexcoords[i][j][1]);
+ glVertex3f(decalvertex[i][j].x, decalvertex[i][j].y, decalvertex[i][j].z);
+ }
+ glEnd();
+ glPopMatrix();
+ }
+ for (i = numdecals - 1; i >= 0; i--) {
+ decalalivetime[i] += multiplier;
+ if (decaltype[i] == blooddecalslow)decalalivetime[i] -= multiplier * 2 / 3;
+ if (decaltype[i] == blooddecalfast)decalalivetime[i] += multiplier * 4;
+ if (decaltype[i] == shadowdecal)DeleteDecal(i);
+ if (decaltype[i] == footprintdecal && decalalivetime[i] >= 5)DeleteDecal(i);
+ if (decaltype[i] == bodyprintdecal && decalalivetime[i] >= 5)DeleteDecal(i);
+ if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow) && decalalivetime[i] >= 60)DeleteDecal(i);
+ }
+ glAlphaFunc(GL_GREATER, 0.0001);
+ }
}
void Terrain::AddObject(XYZ where, float radius, int id)
{
- bool done;
- int i,j;
- XYZ points[4];
- if(id>=0&&id<10000)
- for(i=0;i<subdivision;i++){
- for(j=0;j<subdivision;j++){
- if(patchobjectnum[i][j]<300-1){
- done=0;
- points[0].x=(size/subdivision)*i;
- points[0].z=(size/subdivision)*j;
- points[0].y=heightmap[(int)points[0].x][(int)points[0].z];
- points[1].x=(size/subdivision)*(i+1);
- points[1].z=(size/subdivision)*j;
- points[1].y=heightmap[(int)points[1].x][(int)points[1].z];
- points[2].x=(size/subdivision)*(i+1);
- points[2].z=(size/subdivision)*(j+1);
- points[2].y=heightmap[(int)points[2].x][(int)points[2].z];
- points[3].x=(size/subdivision)*i;
- points[3].z=(size/subdivision)*(j+1);
- points[3].y=heightmap[(int)points[3].x][(int)points[3].z];
- points[0]*=scale;
- points[1]*=scale;
- points[2]*=scale;
- points[3]*=scale;
- if(!done&&where.x+radius>points[0].x&&where.x-radius<points[2].x&&where.z+radius>points[0].z&&where.z-radius<points[2].z){
- patchobjects[i][j][patchobjectnum[i][j]]=id;
- patchobjectnum[i][j]++;
- done=1;
- }
- }
- }
- }
+ bool done;
+ int i, j;
+ XYZ points[4];
+ if (id >= 0 && id < 10000)
+ for (i = 0; i < subdivision; i++) {
+ for (j = 0; j < subdivision; j++) {
+ if (patchobjectnum[i][j] < 300 - 1) {
+ done = 0;
+ points[0].x = (size / subdivision) * i;
+ points[0].z = (size / subdivision) * j;
+ points[0].y = heightmap[(int)points[0].x][(int)points[0].z];
+ points[1].x = (size / subdivision) * (i + 1);
+ points[1].z = (size / subdivision) * j;
+ points[1].y = heightmap[(int)points[1].x][(int)points[1].z];
+ points[2].x = (size / subdivision) * (i + 1);
+ points[2].z = (size / subdivision) * (j + 1);
+ points[2].y = heightmap[(int)points[2].x][(int)points[2].z];
+ points[3].x = (size / subdivision) * i;
+ points[3].z = (size / subdivision) * (j + 1);
+ points[3].y = heightmap[(int)points[3].x][(int)points[3].z];
+ points[0] *= scale;
+ points[1] *= scale;
+ points[2] *= scale;
+ points[3] *= scale;
+ if (!done && where.x + radius > points[0].x && where.x - radius < points[2].x && where.z + radius > points[0].z && where.z - radius < points[2].z) {
+ patchobjects[i][j][patchobjectnum[i][j]] = id;
+ patchobjectnum[i][j]++;
+ done = 1;
+ }
+ }
+ }
+ }
}
void Terrain::DeleteDecal(int which)
{
- if(decals){
- decaltype[which]=decaltype[numdecals-1];
- decalposition[which]=decalposition[numdecals-1];
- for(int i=0;i<3;i++){
- decalvertex[which][i]=decalvertex[numdecals-1][i];
- decaltexcoords[which][i][0]=decaltexcoords[numdecals-1][i][0];
- decaltexcoords[which][i][1]=decaltexcoords[numdecals-1][i][1];
- }
- decalrotation[which]=decalrotation[numdecals-1];
- decalalivetime[which]=decalalivetime[numdecals-1];
- decalopacity[which]=decalopacity[numdecals-1];
- decalbrightness[which]=decalbrightness[numdecals-1];
- numdecals--;
- }
+ if (decals) {
+ decaltype[which] = decaltype[numdecals - 1];
+ decalposition[which] = decalposition[numdecals - 1];
+ for (int i = 0; i < 3; i++) {
+ decalvertex[which][i] = decalvertex[numdecals - 1][i];
+ decaltexcoords[which][i][0] = decaltexcoords[numdecals - 1][i][0];
+ decaltexcoords[which][i][1] = decaltexcoords[numdecals - 1][i][1];
+ }
+ decalrotation[which] = decalrotation[numdecals - 1];
+ decalalivetime[which] = decalalivetime[numdecals - 1];
+ decalopacity[which] = decalopacity[numdecals - 1];
+ decalbrightness[which] = decalbrightness[numdecals - 1];
+ numdecals--;
+ }
}
-void Terrain::MakeDecal(int type, XYZ where, float size, float opacity, float rotation){
- if(decals) {
- if(opacity>0&&size>0) {
- static int patchx[4];
- static int patchy[4];
-
- decaltexcoords[numdecals][0][0]=1;
- decaltexcoords[numdecals][0][1]=0;
-
- patchx[0]=(where.x+size)/scale;
- patchx[1]=(where.x-size)/scale;
- patchx[2]=(where.x-size)/scale;
- patchx[3]=(where.x+size)/scale;
-
- patchy[0]=(where.z-size)/scale;
- patchy[1]=(where.z-size)/scale;
- patchy[2]=(where.z+size)/scale;
- patchy[3]=(where.z+size)/scale;
-
- /*if(patchx[1]<subdivision-1&&patchy[1]<subdivision-1&&patchx[1]>0&&patchy[1]>0)
- if(patchx[2]<subdivision-1&&patchy[2]<subdivision-1&&patchx[2]>0&&patchy[2]>0)
- if(patchx[3]<subdivision-1&&patchy[3]<subdivision-1&&patchx[3]>0&&patchy[3]>0)
- if(patchx[0]<subdivision-1&&patchy[0]<subdivision-1&&patchx[0]>0&&patchy[0]>0){
- */
- if((patchx[0]!=patchx[1]||patchy[0]!=patchy[1])&&(patchx[0]!=patchx[2]||patchy[0]!=patchy[2])&&(patchx[0]!=patchx[3]||patchy[0]!=patchy[3])){
- MakeDecalLock(type,where,patchx[0],patchy[0],size,opacity,rotation);
- }
-
- if((patchx[1]!=patchx[2]||patchy[1]!=patchy[2])&&(patchx[1]!=patchx[3]||patchy[1]!=patchy[3])){
- MakeDecalLock(type,where,patchx[1],patchy[1],size,opacity,rotation);
- }
-
- if((patchx[2]!=patchx[3]||patchy[2]!=patchy[3])){
- MakeDecalLock(type,where,patchx[2],patchy[2],size,opacity,rotation);
- }
- MakeDecalLock(type,where,patchx[3],patchy[3],size,opacity,rotation);
- }
- }
- //}
+void Terrain::MakeDecal(int type, XYZ where, float size, float opacity, float rotation)
+{
+ if (decals) {
+ if (opacity > 0 && size > 0) {
+ static int patchx[4];
+ static int patchy[4];
+
+ decaltexcoords[numdecals][0][0] = 1;
+ decaltexcoords[numdecals][0][1] = 0;
+
+ patchx[0] = (where.x + size) / scale;
+ patchx[1] = (where.x - size) / scale;
+ patchx[2] = (where.x - size) / scale;
+ patchx[3] = (where.x + size) / scale;
+
+ patchy[0] = (where.z - size) / scale;
+ patchy[1] = (where.z - size) / scale;
+ patchy[2] = (where.z + size) / scale;
+ patchy[3] = (where.z + size) / scale;
+
+ /*if(patchx[1]<subdivision-1&&patchy[1]<subdivision-1&&patchx[1]>0&&patchy[1]>0)
+ if(patchx[2]<subdivision-1&&patchy[2]<subdivision-1&&patchx[2]>0&&patchy[2]>0)
+ if(patchx[3]<subdivision-1&&patchy[3]<subdivision-1&&patchx[3]>0&&patchy[3]>0)
+ if(patchx[0]<subdivision-1&&patchy[0]<subdivision-1&&patchx[0]>0&&patchy[0]>0){
+ */
+ if ((patchx[0] != patchx[1] || patchy[0] != patchy[1]) && (patchx[0] != patchx[2] || patchy[0] != patchy[2]) && (patchx[0] != patchx[3] || patchy[0] != patchy[3])) {
+ MakeDecalLock(type, where, patchx[0], patchy[0], size, opacity, rotation);
+ }
+
+ if ((patchx[1] != patchx[2] || patchy[1] != patchy[2]) && (patchx[1] != patchx[3] || patchy[1] != patchy[3])) {
+ MakeDecalLock(type, where, patchx[1], patchy[1], size, opacity, rotation);
+ }
+
+ if ((patchx[2] != patchx[3] || patchy[2] != patchy[3])) {
+ MakeDecalLock(type, where, patchx[2], patchy[2], size, opacity, rotation);
+ }
+ MakeDecalLock(type, where, patchx[3], patchy[3], size, opacity, rotation);
+ }
+ }
+ //}
}
-void Terrain::MakeDecalLock(int type, XYZ where,int whichx, int whichy, float size, float opacity, float rotation){
- if(decals){
- static float placex,placez;
- static XYZ rot;
+void Terrain::MakeDecalLock(int type, XYZ where, int whichx, int whichy, float size, float opacity, float rotation)
+{
+ if (decals) {
+ static float placex, placez;
+ static XYZ rot;
- float decalbright;
+ float decalbright;
- rot=getLighting(where.x,where.z);
- decalbrightness[numdecals]=(rot.x+rot.y+rot.z)/3;
- if(decalbrightness[numdecals]<.4)decalbrightness[numdecals]=.4;
+ rot = getLighting(where.x, where.z);
+ decalbrightness[numdecals] = (rot.x + rot.y + rot.z) / 3;
+ if (decalbrightness[numdecals] < .4)decalbrightness[numdecals] = .4;
- if(environment==grassyenvironment){
- decalbrightness[numdecals]*=.6;
- }
+ if (environment == grassyenvironment) {
+ decalbrightness[numdecals] *= .6;
+ }
- if(decalbrightness[numdecals]>1)decalbrightness[numdecals]=1;
- decalbright=decalbrightness[numdecals];
+ if (decalbrightness[numdecals] > 1)decalbrightness[numdecals] = 1;
+ decalbright = decalbrightness[numdecals];
- decalposition[numdecals]=where;
- decaltype[numdecals]=type;
- decalopacity[numdecals]=opacity;
- decalrotation[numdecals]=rotation;
- decalalivetime[numdecals]=0;
+ decalposition[numdecals] = where;
+ decaltype[numdecals] = type;
+ decalopacity[numdecals] = opacity;
+ decalrotation[numdecals] = rotation;
+ decalalivetime[numdecals] = 0;
- placex=(float)whichx*scale+scale;
- placez=(float)whichy*scale;
+ placex = (float)whichx * scale + scale;
+ placez = (float)whichy * scale;
- decaltexcoords[numdecals][0][0]=(placex-where.x)/size/2+.5;
- decaltexcoords[numdecals][0][1]=(placez-where.z)/size/2+.5;
+ decaltexcoords[numdecals][0][0] = (placex - where.x) / size / 2 + .5;
+ decaltexcoords[numdecals][0][1] = (placez - where.z) / size / 2 + .5;
- decalvertex[numdecals][0].x=placex;
- decalvertex[numdecals][0].z=placez;
- decalvertex[numdecals][0].y=heightmap[whichx+1][whichy]*scale+.01;
+ decalvertex[numdecals][0].x = placex;
+ decalvertex[numdecals][0].z = placez;
+ decalvertex[numdecals][0].y = heightmap[whichx + 1][whichy] * scale + .01;
- placex=(float)whichx*scale+scale;
- placez=(float)whichy*scale+scale;
+ placex = (float)whichx * scale + scale;
+ placez = (float)whichy * scale + scale;
- decaltexcoords[numdecals][1][0]=(placex-where.x)/size/2+.5;
- decaltexcoords[numdecals][1][1]=(placez-where.z)/size/2+.5;
+ decaltexcoords[numdecals][1][0] = (placex - where.x) / size / 2 + .5;
+ decaltexcoords[numdecals][1][1] = (placez - where.z) / size / 2 + .5;
- decalvertex[numdecals][1].x=placex;
- decalvertex[numdecals][1].z=placez;
- decalvertex[numdecals][1].y=heightmap[whichx+1][whichy+1]*scale+.01;
+ decalvertex[numdecals][1].x = placex;
+ decalvertex[numdecals][1].z = placez;
+ decalvertex[numdecals][1].y = heightmap[whichx + 1][whichy + 1] * scale + .01;
- placex=(float)whichx*scale;
- placez=(float)whichy*scale+scale;
+ placex = (float)whichx * scale;
+ placez = (float)whichy * scale + scale;
- decaltexcoords[numdecals][2][0]=(placex-where.x)/size/2+.5;
- decaltexcoords[numdecals][2][1]=(placez-where.z)/size/2+.5;
+ decaltexcoords[numdecals][2][0] = (placex - where.x) / size / 2 + .5;
+ decaltexcoords[numdecals][2][1] = (placez - where.z) / size / 2 + .5;
- decalvertex[numdecals][2].x=placex;
- decalvertex[numdecals][2].z=placez;
- decalvertex[numdecals][2].y=heightmap[whichx][whichy+1]*scale+.01;
+ decalvertex[numdecals][2].x = placex;
+ decalvertex[numdecals][2].z = placez;
+ decalvertex[numdecals][2].y = heightmap[whichx][whichy + 1] * scale + .01;
- if(decalrotation[numdecals]){
- for(int i=0;i<3;i++){
- rot.y=0;
- rot.x=decaltexcoords[numdecals][i][0]-.5;
- rot.z=decaltexcoords[numdecals][i][1]-.5;
- rot=DoRotation(rot,0,-decalrotation[numdecals],0);
- decaltexcoords[numdecals][i][0]=rot.x+.5;
- decaltexcoords[numdecals][i][1]=rot.z+.5;
- }
- }
+ if (decalrotation[numdecals]) {
+ for (int i = 0; i < 3; i++) {
+ rot.y = 0;
+ rot.x = decaltexcoords[numdecals][i][0] - .5;
+ rot.z = decaltexcoords[numdecals][i][1] - .5;
+ rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+ decaltexcoords[numdecals][i][0] = rot.x + .5;
+ decaltexcoords[numdecals][i][1] = rot.z + .5;
+ }
+ }
- if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
- if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
- if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
- if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
- if(numdecals<max_decals-1)numdecals++;
+ if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+ if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+ if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+ if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1))
+ if (numdecals < max_decals - 1)numdecals++;
- decalbrightness[numdecals]=decalbright;
+ decalbrightness[numdecals] = decalbright;
- decalposition[numdecals]=where;
- decaltype[numdecals]=type;
- decalopacity[numdecals]=opacity;
- decalrotation[numdecals]=rotation;
- decalalivetime[numdecals]=0;
+ decalposition[numdecals] = where;
+ decaltype[numdecals] = type;
+ decalopacity[numdecals] = opacity;
+ decalrotation[numdecals] = rotation;
+ decalalivetime[numdecals] = 0;
- placex=(float)whichx*scale+scale;
- placez=(float)whichy*scale;
+ placex = (float)whichx * scale + scale;
+ placez = (float)whichy * scale;
- decaltexcoords[numdecals][0][0]=(placex-where.x)/size/2+.5;
- decaltexcoords[numdecals][0][1]=(placez-where.z)/size/2+.5;
+ decaltexcoords[numdecals][0][0] = (placex - where.x) / size / 2 + .5;
+ decaltexcoords[numdecals][0][1] = (placez - where.z) / size / 2 + .5;
- decalvertex[numdecals][0].x=placex;
- decalvertex[numdecals][0].z=placez;
- decalvertex[numdecals][0].y=heightmap[whichx+1][whichy]*scale+.01;
+ decalvertex[numdecals][0].x = placex;
+ decalvertex[numdecals][0].z = placez;
+ decalvertex[numdecals][0].y = heightmap[whichx + 1][whichy] * scale + .01;
- placex=(float)whichx*scale;
- placez=(float)whichy*scale;
+ placex = (float)whichx * scale;
+ placez = (float)whichy * scale;
- decaltexcoords[numdecals][1][0]=(placex-where.x)/size/2+.5;
- decaltexcoords[numdecals][1][1]=(placez-where.z)/size/2+.5;
+ decaltexcoords[numdecals][1][0] = (placex - where.x) / size / 2 + .5;
+ decaltexcoords[numdecals][1][1] = (placez - where.z) / size / 2 + .5;
- decalvertex[numdecals][1].x=placex;
- decalvertex[numdecals][1].z=placez;
- decalvertex[numdecals][1].y=heightmap[whichx][whichy]*scale+.01;
+ decalvertex[numdecals][1].x = placex;
+ decalvertex[numdecals][1].z = placez;
+ decalvertex[numdecals][1].y = heightmap[whichx][whichy] * scale + .01;
- placex=(float)whichx*scale;
- placez=(float)whichy*scale+scale;
+ placex = (float)whichx * scale;
+ placez = (float)whichy * scale + scale;
- decaltexcoords[numdecals][2][0]=(placex-where.x)/size/2+.5;
- decaltexcoords[numdecals][2][1]=(placez-where.z)/size/2+.5;
+ decaltexcoords[numdecals][2][0] = (placex - where.x) / size / 2 + .5;
+ decaltexcoords[numdecals][2][1] = (placez - where.z) / size / 2 + .5;
- decalvertex[numdecals][2].x=placex;
- decalvertex[numdecals][2].z=placez;
- decalvertex[numdecals][2].y=heightmap[whichx][whichy+1]*scale+.01;
+ decalvertex[numdecals][2].x = placex;
+ decalvertex[numdecals][2].z = placez;
+ decalvertex[numdecals][2].y = heightmap[whichx][whichy + 1] * scale + .01;
- if(decalrotation[numdecals]){
- for(int i=0;i<3;i++){
- rot.y=0;
- rot.x=decaltexcoords[numdecals][i][0]-.5;
- rot.z=decaltexcoords[numdecals][i][1]-.5;
- rot=DoRotation(rot,0,-decalrotation[numdecals],0);
- decaltexcoords[numdecals][i][0]=rot.x+.5;
- decaltexcoords[numdecals][i][1]=rot.z+.5;
- }
- }
+ if (decalrotation[numdecals]) {
+ for (int i = 0; i < 3; i++) {
+ rot.y = 0;
+ rot.x = decaltexcoords[numdecals][i][0] - .5;
+ rot.z = decaltexcoords[numdecals][i][1] - .5;
+ rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+ decaltexcoords[numdecals][i][0] = rot.x + .5;
+ decaltexcoords[numdecals][i][1] = rot.z + .5;
+ }
+ }
- if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
- if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
- if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
- if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
- if(numdecals<max_decals-1)numdecals++;
- }
+ if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+ if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+ if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+ if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1))
+ if (numdecals < max_decals - 1)numdecals++;
+ }
}
void Terrain::DoLighting()
{
- static int i,j,k,todivide;
- static float brightness, total;
- static XYZ blank, terrainpoint,lightloc;
- lightloc=light.location;
- Normalise(&lightloc);
- //Calculate shadows
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- terrainpoint.x=(float)i*scale;
- terrainpoint.z=(float)j*scale;
- terrainpoint.y=heightmap[i][j]*scale+.1;
- /*brightness=0;
- if(lineTerrain(lightlocation*10+terrainpoint,terrainpoint,&blank)==-1)
- */
- brightness=dotproduct(&lightloc,&normals[i][j]);
-
- if(brightness>1)brightness=1;
- if(brightness<0)brightness=0;
-
- colors[i][j][0]=light.color[0]*brightness+light.ambient[0];
- colors[i][j][1]=light.color[1]*brightness+light.ambient[1];
- colors[i][j][2]=light.color[2]*brightness+light.ambient[2];
-
- if(colors[i][j][0]>1)colors[i][j][0]=1;
- if(colors[i][j][1]>1)colors[i][j][1]=1;
- if(colors[i][j][2]>1)colors[i][j][2]=1;
- if(colors[i][j][0]<0)colors[i][j][0]=0;
- if(colors[i][j][1]<0)colors[i][j][1]=0;
- if(colors[i][j][2]<0)colors[i][j][2]=0;
- }
- }
-
- //Smooth shadows
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- for(k=0;k<3;k++){
- total=0;
- todivide=0;
- if(i!=0){ total+=colors[j][i-1][k]; todivide++;}
- if(i!=size-1){ total+=colors[j][i+1][k]; todivide++;}
- if(j!=0){ total+=colors[j-1][i][k]; todivide++;}
- if(j!=size-1){ total+=colors[j+1][i][k]; todivide++;}
- if(i!=0&&j!=0){ total+=colors[j-1][i-1][k]; todivide++;}
- if(i!=size-1&&j!=0){ total+=colors[j-1][i+1][k]; todivide++;}
- if(j!=size-1&&i!=size-1){ total+=colors[j+1][i+1][k]; todivide++;}
- if(j!=size-1&&i!=0){ total+=colors[j+1][i-1][k]; todivide++;}
- total+=colors[j][i][k]; todivide++;
-
- colors[j][i][k]=total/todivide;
- }
- }
- }
+ static int i, j, k, todivide;
+ static float brightness, total;
+ static XYZ blank, terrainpoint, lightloc;
+ lightloc = light.location;
+ Normalise(&lightloc);
+ //Calculate shadows
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ terrainpoint.x = (float)i * scale;
+ terrainpoint.z = (float)j * scale;
+ terrainpoint.y = heightmap[i][j] * scale + .1;
+ /*brightness=0;
+ if(lineTerrain(lightlocation*10+terrainpoint,terrainpoint,&blank)==-1)
+ */
+ brightness = dotproduct(&lightloc, &normals[i][j]);
+
+ if (brightness > 1)brightness = 1;
+ if (brightness < 0)brightness = 0;
+
+ colors[i][j][0] = light.color[0] * brightness + light.ambient[0];
+ colors[i][j][1] = light.color[1] * brightness + light.ambient[1];
+ colors[i][j][2] = light.color[2] * brightness + light.ambient[2];
+
+ if (colors[i][j][0] > 1)colors[i][j][0] = 1;
+ if (colors[i][j][1] > 1)colors[i][j][1] = 1;
+ if (colors[i][j][2] > 1)colors[i][j][2] = 1;
+ if (colors[i][j][0] < 0)colors[i][j][0] = 0;
+ if (colors[i][j][1] < 0)colors[i][j][1] = 0;
+ if (colors[i][j][2] < 0)colors[i][j][2] = 0;
+ }
+ }
+
+ //Smooth shadows
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ for (k = 0; k < 3; k++) {
+ total = 0;
+ todivide = 0;
+ if (i != 0) {
+ total += colors[j][i - 1][k];
+ todivide++;
+ }
+ if (i != size - 1) {
+ total += colors[j][i + 1][k];
+ todivide++;
+ }
+ if (j != 0) {
+ total += colors[j - 1][i][k];
+ todivide++;
+ }
+ if (j != size - 1) {
+ total += colors[j + 1][i][k];
+ todivide++;
+ }
+ if (i != 0 && j != 0) {
+ total += colors[j - 1][i - 1][k];
+ todivide++;
+ }
+ if (i != size - 1 && j != 0) {
+ total += colors[j - 1][i + 1][k];
+ todivide++;
+ }
+ if (j != size - 1 && i != size - 1) {
+ total += colors[j + 1][i + 1][k];
+ todivide++;
+ }
+ if (j != size - 1 && i != 0) {
+ total += colors[j + 1][i - 1][k];
+ todivide++;
+ }
+ total += colors[j][i][k];
+ todivide++;
+
+ colors[j][i][k] = total / todivide;
+ }
+ }
+ }
}
void Terrain::DoShadows()
{
- static int i,j,k,l,todivide;
- static float brightness, total;
- static XYZ testpoint,testpoint2, terrainpoint,lightloc,col;
- lightloc=light.location;
- if(!skyboxtexture){
- lightloc.x=0;
- lightloc.z=0;
- }
- if(skyboxtexture&&tutoriallevel){
- lightloc.x*=.4;
- lightloc.z*=.4;
- }
- int patchx,patchz;
- float shadowed;
- Normalise(&lightloc);
- //Calculate shadows
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- terrainpoint.x=(float)(i)*scale;
- terrainpoint.z=(float)(j)*scale;
- terrainpoint.y=heightmap[i][j]*scale;
-
- shadowed=0;
- patchx=(float)(i)*subdivision/size;
- patchz=(float)(j)*subdivision/size;
- if(patchobjectnum[patchx][patchz]){
- for(k=0;k<patchobjectnum[patchx][patchz];k++){
- l=patchobjects[patchx][patchz][k];
- if(objects.type[l]!=treetrunktype){
- testpoint=terrainpoint;
- testpoint2=terrainpoint+lightloc*50*(1-shadowed);
- if(objects.model[l].LineCheck(&testpoint,&testpoint2,&col,&objects.position[l],&objects.yaw[l])!=-1){
- shadowed=1-(findDistance(&terrainpoint,&col)/50);
- }
- }
- }
- if(visibleloading) Game::LoadingScreen();
- }
- brightness=dotproduct(&lightloc,&normals[i][j]);
- if(shadowed)brightness*=1-shadowed;
-
- if(brightness>1)brightness=1;
- if(brightness<0)brightness=0;
-
- colors[i][j][0]=light.color[0]*brightness+light.ambient[0];
- colors[i][j][1]=light.color[1]*brightness+light.ambient[1];
- colors[i][j][2]=light.color[2]*brightness+light.ambient[2];
-
- if(colors[i][j][0]>1)colors[i][j][0]=1;
- if(colors[i][j][1]>1)colors[i][j][1]=1;
- if(colors[i][j][2]>1)colors[i][j][2]=1;
- if(colors[i][j][0]<0)colors[i][j][0]=0;
- if(colors[i][j][1]<0)colors[i][j][1]=0;
- if(colors[i][j][2]<0)colors[i][j][2]=0;
- }
- }
-
- if(visibleloading) Game::LoadingScreen();
-
- //Smooth shadows
- for(i=0;i<size;i++){
- for(j=0;j<size;j++){
- for(k=0;k<3;k++){
- total=0;
- todivide=0;
- if(i!=0){ total+=colors[j][i-1][k]; todivide++;}
- if(i!=size-1){ total+=colors[j][i+1][k]; todivide++;}
- if(j!=0){ total+=colors[j-1][i][k]; todivide++;}
- if(j!=size-1){ total+=colors[j+1][i][k]; todivide++;}
- if(i!=0&&j!=0){ total+=colors[j-1][i-1][k]; todivide++;}
- if(i!=size-1&&j!=0){ total+=colors[j-1][i+1][k]; todivide++;}
- if(j!=size-1&&i!=size-1){ total+=colors[j+1][i+1][k]; todivide++;}
- if(j!=size-1&&i!=0){ total+=colors[j+1][i-1][k]; todivide++;}
- total+=colors[j][i][k]; todivide++;
-
- colors[j][i][k]=total/todivide;
- }
- }
- }
-
- for(i=0;i<subdivision;i++){
- for(j=0;j<subdivision;j++){
- UpdateVertexArray(i,j);
- }
- }
+ static int i, j, k, l, todivide;
+ static float brightness, total;
+ static XYZ testpoint, testpoint2, terrainpoint, lightloc, col;
+ lightloc = light.location;
+ if (!skyboxtexture) {
+ lightloc.x = 0;
+ lightloc.z = 0;
+ }
+ if (skyboxtexture && tutoriallevel) {
+ lightloc.x *= .4;
+ lightloc.z *= .4;
+ }
+ int patchx, patchz;
+ float shadowed;
+ Normalise(&lightloc);
+ //Calculate shadows
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ terrainpoint.x = (float)(i) * scale;
+ terrainpoint.z = (float)(j) * scale;
+ terrainpoint.y = heightmap[i][j] * scale;
+
+ shadowed = 0;
+ patchx = (float)(i) * subdivision / size;
+ patchz = (float)(j) * subdivision / size;
+ if (patchobjectnum[patchx][patchz]) {
+ for (k = 0; k < patchobjectnum[patchx][patchz]; k++) {
+ l = patchobjects[patchx][patchz][k];
+ if (objects.type[l] != treetrunktype) {
+ testpoint = terrainpoint;
+ testpoint2 = terrainpoint + lightloc * 50 * (1 - shadowed);
+ if (objects.model[l].LineCheck(&testpoint, &testpoint2, &col, &objects.position[l], &objects.yaw[l]) != -1) {
+ shadowed = 1 - (findDistance(&terrainpoint, &col) / 50);
+ }
+ }
+ }
+ if (visibleloading) Game::LoadingScreen();
+ }
+ brightness = dotproduct(&lightloc, &normals[i][j]);
+ if (shadowed)brightness *= 1 - shadowed;
+
+ if (brightness > 1)brightness = 1;
+ if (brightness < 0)brightness = 0;
+
+ colors[i][j][0] = light.color[0] * brightness + light.ambient[0];
+ colors[i][j][1] = light.color[1] * brightness + light.ambient[1];
+ colors[i][j][2] = light.color[2] * brightness + light.ambient[2];
+
+ if (colors[i][j][0] > 1)colors[i][j][0] = 1;
+ if (colors[i][j][1] > 1)colors[i][j][1] = 1;
+ if (colors[i][j][2] > 1)colors[i][j][2] = 1;
+ if (colors[i][j][0] < 0)colors[i][j][0] = 0;
+ if (colors[i][j][1] < 0)colors[i][j][1] = 0;
+ if (colors[i][j][2] < 0)colors[i][j][2] = 0;
+ }
+ }
+
+ if (visibleloading) Game::LoadingScreen();
+
+ //Smooth shadows
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ for (k = 0; k < 3; k++) {
+ total = 0;
+ todivide = 0;
+ if (i != 0) {
+ total += colors[j][i - 1][k];
+ todivide++;
+ }
+ if (i != size - 1) {
+ total += colors[j][i + 1][k];
+ todivide++;
+ }
+ if (j != 0) {
+ total += colors[j - 1][i][k];
+ todivide++;
+ }
+ if (j != size - 1) {
+ total += colors[j + 1][i][k];
+ todivide++;
+ }
+ if (i != 0 && j != 0) {
+ total += colors[j - 1][i - 1][k];
+ todivide++;
+ }
+ if (i != size - 1 && j != 0) {
+ total += colors[j - 1][i + 1][k];
+ todivide++;
+ }
+ if (j != size - 1 && i != size - 1) {
+ total += colors[j + 1][i + 1][k];
+ todivide++;
+ }
+ if (j != size - 1 && i != 0) {
+ total += colors[j + 1][i - 1][k];
+ todivide++;
+ }
+ total += colors[j][i][k];
+ todivide++;
+
+ colors[j][i][k] = total / todivide;
+ }
+ }
+ }
+
+ for (i = 0; i < subdivision; i++) {
+ for (j = 0; j < subdivision; j++) {
+ UpdateVertexArray(i, j);
+ }
+ }
}
Terrain::Terrain()
{
- size = 0;
-
- memset(patchobjectnum, 0, sizeof(patchobjectnum));
- memset(patchobjects, 0, sizeof(patchobjects));
-
- scale = 1.0f;
- type = 0;
- memset(heightmap, 0, sizeof(heightmap));
- memset(normals, 0, sizeof(normals));
- memset(facenormals, 0, sizeof(facenormals));
- memset(triangles, 0, sizeof(triangles));
- memset(colors, 0, sizeof(colors));
- memset(opacityother, 0, sizeof(opacityother));
- memset(texoffsetx, 0, sizeof(texoffsetx));
- memset(texoffsety, 0, sizeof(texoffsety));
- memset(numtris, 0, sizeof(numtris));
- memset(textureness, 0, sizeof(textureness));
-
- memset(vArray, 0, sizeof(vArray));
-
- memset(visible, 0, sizeof(visible));
- memset(avgypatch, 0, sizeof(avgypatch));
- memset(maxypatch, 0, sizeof(maxypatch));
- memset(minypatch, 0, sizeof(minypatch));
- memset(heightypatch, 0, sizeof(heightypatch));
-
- patch_elements = 0;
-
- memset(decaltexcoords, 0, sizeof(decaltexcoords));
- memset(decalvertex, 0, sizeof(decalvertex));
- memset(decaltype, 0, sizeof(decaltype));
- memset(decalopacity, 0, sizeof(decalopacity));
- memset(decalrotation, 0, sizeof(decalrotation));
- memset(decalalivetime, 0, sizeof(decalalivetime));
- memset(decalbrightness, 0, sizeof(decalbrightness));
- memset(decalposition, 0, sizeof(decalposition));
- numdecals = 0;
+ size = 0;
+
+ memset(patchobjectnum, 0, sizeof(patchobjectnum));
+ memset(patchobjects, 0, sizeof(patchobjects));
+
+ scale = 1.0f;
+ type = 0;
+ memset(heightmap, 0, sizeof(heightmap));
+ memset(normals, 0, sizeof(normals));
+ memset(facenormals, 0, sizeof(facenormals));
+ memset(triangles, 0, sizeof(triangles));
+ memset(colors, 0, sizeof(colors));
+ memset(opacityother, 0, sizeof(opacityother));
+ memset(texoffsetx, 0, sizeof(texoffsetx));
+ memset(texoffsety, 0, sizeof(texoffsety));
+ memset(numtris, 0, sizeof(numtris));
+ memset(textureness, 0, sizeof(textureness));
+
+ memset(vArray, 0, sizeof(vArray));
+
+ memset(visible, 0, sizeof(visible));
+ memset(avgypatch, 0, sizeof(avgypatch));
+ memset(maxypatch, 0, sizeof(maxypatch));
+ memset(minypatch, 0, sizeof(minypatch));
+ memset(heightypatch, 0, sizeof(heightypatch));
+
+ patch_elements = 0;
+
+ memset(decaltexcoords, 0, sizeof(decaltexcoords));
+ memset(decalvertex, 0, sizeof(decalvertex));
+ memset(decaltype, 0, sizeof(decaltype));
+ memset(decalopacity, 0, sizeof(decalopacity));
+ memset(decalrotation, 0, sizeof(decalrotation));
+ memset(decalalivetime, 0, sizeof(decalalivetime));
+ memset(decalbrightness, 0, sizeof(decalbrightness));
+ memset(decalposition, 0, sizeof(decalposition));
+ numdecals = 0;
}
Terrain::~Terrain()
{
- terraintexture.destroy();
- shadowtexture.destroy();
- bodyprinttexture.destroy();
- footprinttexture.destroy();
- bloodtexture.destroy();
- bloodtexture2.destroy();
- breaktexture.destroy();
+ terraintexture.destroy();
+ shadowtexture.destroy();
+ bodyprinttexture.destroy();
+ footprinttexture.destroy();
+ bloodtexture.destroy();
+ bloodtexture2.destroy();
+ breaktexture.destroy();
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#include "Quaternions.h"
#include "Texture.h"
-#define max_terrain_size 256
+#define max_terrain_size 256
#define curr_terrain_size size
#define subdivision 64
#define max_patch_elements (max_terrain_size/subdivision)*(max_terrain_size/subdivision)*54
// Model Structures
//
-class Terrain{
+class Terrain
+{
public:
- Texture bloodtexture;
- Texture bloodtexture2;
- Texture shadowtexture;
- Texture footprinttexture;
- Texture bodyprinttexture;
- Texture breaktexture;
- Texture terraintexture;
- short size;
-
- int patchobjectnum[subdivision][subdivision];
- int patchobjects[subdivision][subdivision][300];
-
- float scale;
- int type;
- float heightmap[max_terrain_size+1][max_terrain_size+1];
- XYZ normals[max_terrain_size][max_terrain_size];
- XYZ facenormals[max_terrain_size][max_terrain_size];
- XYZ triangles[(max_terrain_size-1)*(max_terrain_size-1)*2][3];
- float colors[max_terrain_size][max_terrain_size][4];
- float opacityother[max_terrain_size][max_terrain_size];
- float texoffsetx[max_terrain_size][max_terrain_size];
- float texoffsety[max_terrain_size][max_terrain_size];
- int numtris[subdivision][subdivision];
- int textureness[subdivision][subdivision];
-
- GLfloat vArray[(max_patch_elements)*subdivision*subdivision];
-
- bool visible[subdivision][subdivision];
- float avgypatch[subdivision][subdivision];
- float maxypatch[subdivision][subdivision];
- float minypatch[subdivision][subdivision];
- float heightypatch[subdivision][subdivision];
-
- int patch_elements;
-
- float decaltexcoords[max_decals][3][2];
- XYZ decalvertex[max_decals][3];
- int decaltype[max_decals];
- float decalopacity[max_decals];
- float decalrotation[max_decals];
- float decalalivetime[max_decals];
- float decalbrightness[max_decals];
- XYZ decalposition[max_decals];
- int numdecals;
-
- void AddObject(XYZ where, float radius,int id);
- void DeleteDecal(int which);
- void MakeDecal(int type, XYZ where, float size, float opacity, float rotation);
- void MakeDecalLock(int type, XYZ where, int whichx, int whichy, float size, float opacity, float rotation);
- int lineTerrain(XYZ p1,XYZ p2, XYZ *p);
- float getHeight(float pointx, float pointz);
- float getHeightExtrude(float pointx, float pointz,float point2x, float point2z);
- float getOpacity(float pointx, float pointz);
- XYZ getLighting(float pointx, float pointz);
- XYZ getNormal(float pointx, float pointz);
- void UpdateVertexArray(int whichx, int whichy);
- void UpdateTransparency(int whichx, int whichy);
- void UpdateTransparencyother(int whichx, int whichy);
- void UpdateTransparencyotherother(int whichx, int whichy);
- bool load(const char *fileName);
- void CalculateNormals();
- void drawdecals();
- void draw(int layer);
- void drawpatch(int whichx, int whichy, float opacity);
- void drawpatchother(int whichx, int whichy, float opacity);
- void drawpatchotherother(int whichx, int whichy, float opacity);
- void DoLighting();
- void DoShadows();
-
- Terrain();
- ~Terrain();
+ Texture bloodtexture;
+ Texture bloodtexture2;
+ Texture shadowtexture;
+ Texture footprinttexture;
+ Texture bodyprinttexture;
+ Texture breaktexture;
+ Texture terraintexture;
+ short size;
+
+ int patchobjectnum[subdivision][subdivision];
+ int patchobjects[subdivision][subdivision][300];
+
+ float scale;
+ int type;
+ float heightmap[max_terrain_size + 1][max_terrain_size + 1];
+ XYZ normals[max_terrain_size][max_terrain_size];
+ XYZ facenormals[max_terrain_size][max_terrain_size];
+ XYZ triangles[(max_terrain_size - 1) * (max_terrain_size - 1) * 2][3];
+ float colors[max_terrain_size][max_terrain_size][4];
+ float opacityother[max_terrain_size][max_terrain_size];
+ float texoffsetx[max_terrain_size][max_terrain_size];
+ float texoffsety[max_terrain_size][max_terrain_size];
+ int numtris[subdivision][subdivision];
+ int textureness[subdivision][subdivision];
+
+ GLfloat vArray[(max_patch_elements)*subdivision*subdivision];
+
+ bool visible[subdivision][subdivision];
+ float avgypatch[subdivision][subdivision];
+ float maxypatch[subdivision][subdivision];
+ float minypatch[subdivision][subdivision];
+ float heightypatch[subdivision][subdivision];
+
+ int patch_elements;
+
+ float decaltexcoords[max_decals][3][2];
+ XYZ decalvertex[max_decals][3];
+ int decaltype[max_decals];
+ float decalopacity[max_decals];
+ float decalrotation[max_decals];
+ float decalalivetime[max_decals];
+ float decalbrightness[max_decals];
+ XYZ decalposition[max_decals];
+ int numdecals;
+
+ void AddObject(XYZ where, float radius, int id);
+ void DeleteDecal(int which);
+ void MakeDecal(int type, XYZ where, float size, float opacity, float rotation);
+ void MakeDecalLock(int type, XYZ where, int whichx, int whichy, float size, float opacity, float rotation);
+ int lineTerrain(XYZ p1, XYZ p2, XYZ *p);
+ float getHeight(float pointx, float pointz);
+ float getHeightExtrude(float pointx, float pointz, float point2x, float point2z);
+ float getOpacity(float pointx, float pointz);
+ XYZ getLighting(float pointx, float pointz);
+ XYZ getNormal(float pointx, float pointz);
+ void UpdateVertexArray(int whichx, int whichy);
+ void UpdateTransparency(int whichx, int whichy);
+ void UpdateTransparencyother(int whichx, int whichy);
+ void UpdateTransparencyotherother(int whichx, int whichy);
+ bool load(const char *fileName);
+ void CalculateNormals();
+ void drawdecals();
+ void draw(int layer);
+ void drawpatch(int whichx, int whichy, float opacity);
+ void drawpatchother(int whichx, int whichy, float opacity);
+ void drawpatchotherother(int whichx, int whichy, float opacity);
+ void DoLighting();
+ void DoShadows();
+
+ Terrain();
+ ~Terrain();
};
#endif
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
void Text::LoadFontTexture(const char *fileName)
{
- GLuint type;
-
- LOGFUNC;
-
- LOG(std::string("Loading font texture...") + fileName);
-
- FontTexture.load(fileName, false, false);
-/*
- //Load Image
- //LoadTGA( fileName );
- unsigned char fileNamep[256];
- CopyCStringToPascal(fileName,fileNamep);
- //Load Image
- upload_image( fileNamep ,1);
-
- //Is it valid?
- if(1==1){
- //Alpha channel?
- if ( texture.bpp == 24 )
- type = GL_RGB;
- else
- type = GL_RGBA;
-
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
-
- if(!FontTexture)glGenTextures( 1, &FontTexture );
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-
- glBindTexture( GL_TEXTURE_2D, FontTexture);
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-
- gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
- }
-*/
- if (base)
- {
- glDeleteLists(base, 512);
- base = 0;
- }
+ GLuint type;
+
+ LOGFUNC;
+
+ LOG(std::string("Loading font texture...") + fileName);
+
+ FontTexture.load(fileName, false, false);
+ /*
+ //Load Image
+ //LoadTGA( fileName );
+ unsigned char fileNamep[256];
+ CopyCStringToPascal(fileName,fileNamep);
+ //Load Image
+ upload_image( fileNamep ,1);
+
+ //Is it valid?
+ if(1==1){
+ //Alpha channel?
+ if ( texture.bpp == 24 )
+ type = GL_RGB;
+ else
+ type = GL_RGBA;
+
+ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+
+ if(!FontTexture)glGenTextures( 1, &FontTexture );
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+
+ glBindTexture( GL_TEXTURE_2D, FontTexture);
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+
+ gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
+ }
+ */
+ if (base) {
+ glDeleteLists(base, 512);
+ base = 0;
+ }
}
void Text::BuildFont() // Build Our Font Display List
{
- float cx; // Holds Our X Character Coord
- float cy; // Holds Our Y Character Coord
- int loop;
+ float cx; // Holds Our X Character Coord
+ float cy; // Holds Our Y Character Coord
+ int loop;
- LOGFUNC;
+ LOGFUNC;
- if (base)
- {
- glDeleteLists(base, 512);
- base = 0;
- //LOG("Font already created...");
- //return;
- }
+ if (base) {
+ glDeleteLists(base, 512);
+ base = 0;
+ //LOG("Font already created...");
+ //return;
+ }
// base=glGenLists(256); // Creating 256 Display Lists
- base=glGenLists(512); // Creating 256 Display Lists
- FontTexture.bind();
- for (loop=0; loop<512; loop++) // Loop Through All 256 Lists
- {
- if (loop < 256)
- {
- cx=float(loop%16)/16.0f; // X Position Of Current Character
- cy=float(loop/16)/16.0f; // Y Position Of Current Character
- }
- else
- {
- cx=float((loop-256)%16)/16.0f; // X Position Of Current Character
- cy=float((loop-256)/16)/16.0f; // Y Position Of Current Character
- }
- glNewList(base+loop,GL_COMPILE); // Start Building A List
- glBegin(GL_QUADS); // Use A Quad For Each Character
- glTexCoord2f(cx,1-cy-0.0625f+.001); // Texture Coord (Bottom Left)
- glVertex2i(0,0); // Vertex Coord (Bottom Left)
- glTexCoord2f(cx+0.0625f,1-cy-0.0625f+.001); // Texture Coord (Bottom Right)
- glVertex2i(16,0); // Vertex Coord (Bottom Right)
- glTexCoord2f(cx+0.0625f,1-cy-.001); // Texture Coord (Top Right)
- glVertex2i(16,16); // Vertex Coord (Top Right)
- glTexCoord2f(cx,1-cy-+.001); // Texture Coord (Top Left)
- glVertex2i(0,16); // Vertex Coord (Top Left)
- glEnd(); // Done Building Our Quad (Character)
- if (loop < 256)
- glTranslated(10,0,0); // Move To The Right Of The Character
- else
- glTranslated(8,0,0); // Move To The Right Of The Character
- glEndList(); // Done Building The Display List
- } // Loop Until All 256 Are Built
+ base = glGenLists(512); // Creating 256 Display Lists
+ FontTexture.bind();
+ for (loop = 0; loop < 512; loop++) { // Loop Through All 256 Lists
+ if (loop < 256) {
+ cx = float(loop % 16) / 16.0f; // X Position Of Current Character
+ cy = float(loop / 16) / 16.0f; // Y Position Of Current Character
+ } else {
+ cx = float((loop - 256) % 16) / 16.0f; // X Position Of Current Character
+ cy = float((loop - 256) / 16) / 16.0f; // Y Position Of Current Character
+ }
+ glNewList(base + loop, GL_COMPILE); // Start Building A List
+ glBegin(GL_QUADS); // Use A Quad For Each Character
+ glTexCoord2f(cx, 1 - cy - 0.0625f + .001); // Texture Coord (Bottom Left)
+ glVertex2i(0, 0); // Vertex Coord (Bottom Left)
+ glTexCoord2f(cx + 0.0625f, 1 - cy - 0.0625f + .001); // Texture Coord (Bottom Right)
+ glVertex2i(16, 0); // Vertex Coord (Bottom Right)
+ glTexCoord2f(cx + 0.0625f, 1 - cy - .001); // Texture Coord (Top Right)
+ glVertex2i(16, 16); // Vertex Coord (Top Right)
+ glTexCoord2f(cx, 1 - cy - +.001); // Texture Coord (Top Left)
+ glVertex2i(0, 16); // Vertex Coord (Top Left)
+ glEnd(); // Done Building Our Quad (Character)
+ if (loop < 256)
+ glTranslated(10, 0, 0); // Move To The Right Of The Character
+ else
+ glTranslated(8, 0, 0); // Move To The Right Of The Character
+ glEndList(); // Done Building The Display List
+ } // Loop Until All 256 Are Built
}
void Text::glPrint(float x, float y, const char *string, int set, float size, float width, float height) // Where The Printing Happens
{
- glPrint(x, y, string, set, size, width, height, 0, strlen(string));
+ glPrint(x, y, string, set, size, width, height, 0, strlen(string));
}
-void Text::_glPrint(float x, float y, const char *string, int set, float size, float width, float height,int start,int end, int offset) // Where The Printing Happens
+void Text::_glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end, int offset) // Where The Printing Happens
{
- if (set>1)
- {
- set=1;
- }
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
- FontTexture.bind();
- glDisable(GL_DEPTH_TEST); // Disables Depth Testing
- glDisable(GL_LIGHTING);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPushMatrix(); // Store The Projection Matrix
- glLoadIdentity(); // Reset The Projection Matrix
- glOrtho(0,width,0,height,-100,100); // Set Up An Ortho Screen
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix(); // Store The Modelview Matrix
- glLoadIdentity();
- glTranslated(x,y,0); // Position The Text (0,0 - Bottom Left)
- glScalef(size,size,1); // Reset The Modelview Matrix
- glListBase(base-32+(128*set) + offset); // Choose The Font Set (0 or 1)
- glCallLists(end-start,GL_BYTE,&string[start]); // Write The Text To The Screen
- glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPopMatrix(); // Restore The Old Projection Matrix
- glEnable(GL_DEPTH_TEST); // Enables Depth Testing
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+ if (set > 1) {
+ set = 1;
+ }
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+ FontTexture.bind();
+ glDisable(GL_DEPTH_TEST); // Disables Depth Testing
+ glDisable(GL_LIGHTING);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPushMatrix(); // Store The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+ glOrtho(0, width, 0, height, -100, 100); // Set Up An Ortho Screen
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix(); // Store The Modelview Matrix
+ glLoadIdentity();
+ glTranslated(x, y, 0); // Position The Text (0,0 - Bottom Left)
+ glScalef(size, size, 1); // Reset The Modelview Matrix
+ glListBase(base - 32 + (128 * set) + offset); // Choose The Font Set (0 or 1)
+ glCallLists(end - start, GL_BYTE, &string[start]); // Write The Text To The Screen
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPopMatrix(); // Restore The Old Projection Matrix
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
}
-void Text::glPrint(float x, float y, const char *string, int set, float size, float width, float height,int start,int end) // Where The Printing Happens
+void Text::glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end) // Where The Printing Happens
{
- _glPrint(x, y, string, set, size, width, height, start, end, 0);
+ _glPrint(x, y, string, set, size, width, height, start, end, 0);
}
void Text::glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height) // Where The Printing Happens
{
- glPrintOutline(x, y, string, set, size, width, height, 0, strlen(string));
+ glPrintOutline(x, y, string, set, size, width, height, 0, strlen(string));
}
-void Text::glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height,int start,int end) // Where The Printing Happens
+void Text::glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height, int start, int end) // Where The Printing Happens
{
- _glPrint(x, y, string, set, size, width, height, start, end, 256);
+ _glPrint(x, y, string, set, size, width, height, start, end, 256);
}
void Text::glPrintOutlined(float x, float y, const char *string, int set, float size, float width, float height) // Where The Printing Happens
{
- glPrintOutlined(1, 1, 1, x, y, string, set, size, width, height);
+ glPrintOutlined(1, 1, 1, x, y, string, set, size, width, height);
}
void Text::glPrintOutlined(float r, float g, float b, float x, float y, const char *string, int set, float size, float width, float height) // Where The Printing Happens
{
- glColor4f(0,0,0,1);
- glPrintOutline( x-2*size, y-2*size, string, set, size*2.5/2, width, height);
- glColor4f(r,g,b,1);
- glPrint( x, y, string, set, size, width, height);
+ glColor4f(0, 0, 0, 1);
+ glPrintOutline( x - 2 * size, y - 2 * size, string, set, size * 2.5 / 2, width, height);
+ glColor4f(r, g, b, 1);
+ glPrint( x, y, string, set, size, width, height);
}
-Text::Text() {
- base = 0;
+Text::Text()
+{
+ base = 0;
}
-Text::~Text() {
- if (base) {
- glDeleteLists(base, 512);
- base = 0;
- }
- FontTexture.destroy();
+Text::~Text()
+{
+ if (base) {
+ glDeleteLists(base, 512);
+ base = 0;
+ }
+ FontTexture.destroy();
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#include "TGALoader.h"
#include "Texture.h"
-class Text{
+class Text
+{
public:
- Texture FontTexture;
- GLuint base;
+ Texture FontTexture;
+ GLuint base;
- void LoadFontTexture(const char *fileName);
- void BuildFont();
- void glPrint(float x, float y, const char *string, int set, float size, float width, float height);
- void glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height);
- void glPrint(float x, float y, const char *string, int set, float size, float width, float height,int start,int end);
- void glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height,int start,int end);
- void glPrintOutlined(float x, float y, const char *string, int set, float size, float width, float height);
- void glPrintOutlined(float r, float g, float b, float x, float y, const char *string, int set, float size, float width, float height);
+ void LoadFontTexture(const char *fileName);
+ void BuildFont();
+ void glPrint(float x, float y, const char *string, int set, float size, float width, float height);
+ void glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height);
+ void glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end);
+ void glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height, int start, int end);
+ void glPrintOutlined(float x, float y, const char *string, int set, float size, float width, float height);
+ void glPrintOutlined(float r, float g, float b, float x, float y, const char *string, int set, float size, float width, float height);
- Text();
- ~Text();
+ Text();
+ ~Text();
private:
- void _glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end, int offset);
+ void _glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end, int offset);
};
#endif
extern bool trilinear;
-class TextureRes {
+class TextureRes
+{
private:
static vector<TextureRes*> list;
vector<TextureRes*> TextureRes::list;
-void TextureRes::load(){
+void TextureRes::load()
+{
//load image into 'texture' global var
- if(!skindata){
+ if (!skindata) {
unsigned char filenamep[256];
- CopyCStringToPascal(ConvertFileName(filename.c_str()),filenamep);
- upload_image(filenamep,hasAlpha);
+ CopyCStringToPascal(ConvertFileName(filename.c_str()), filenamep);
+ upload_image(filenamep, hasAlpha);
}
-
- skinsize=texture.sizeX;
- GLuint type=GL_RGBA;
- if(texture.bpp==24)
- type=GL_RGB;
-
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
-
- glDeleteTextures(1,&id);
- glGenTextures(1,&id);
- glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
-
- glBindTexture(GL_TEXTURE_2D, id);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- if(hasMipmap){
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,(trilinear?GL_LINEAR_MIPMAP_LINEAR:GL_LINEAR_MIPMAP_NEAREST));
- glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);
- }else{
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+
+ skinsize = texture.sizeX;
+ GLuint type = GL_RGBA;
+ if (texture.bpp == 24)
+ type = GL_RGB;
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ glDeleteTextures(1, &id);
+ glGenTextures(1, &id);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glBindTexture(GL_TEXTURE_2D, id);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ if (hasMipmap) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (trilinear ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR_MIPMAP_NEAREST));
+ glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
+ } else {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
}
-
- if(isSkin){
- if(skindata){
+
+ if (isSkin) {
+ if (skindata) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, skinsize, skinsize, 0, GL_RGB, GL_UNSIGNED_BYTE, skindata);
- }else{
+ } else {
free(data);
- const int nb=texture.sizeY*texture.sizeX*(texture.bpp/8);
- data=(GLubyte*)malloc(nb*sizeof(GLubyte));
- datalen=0;
- for(int i=0;i<nb;i++)
- if((i+1)%4||type==GL_RGB)
- data[datalen++]=texture.data[i];
+ const int nb = texture.sizeY * texture.sizeX * (texture.bpp / 8);
+ data = (GLubyte*)malloc(nb * sizeof(GLubyte));
+ datalen = 0;
+ for (int i = 0; i < nb; i++)
+ if ((i + 1) % 4 || type == GL_RGB)
+ data[datalen++] = texture.data[i];
glTexImage2D(GL_TEXTURE_2D, 0, type, texture.sizeX, texture.sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
}
- }else{
+ } else {
glTexImage2D(GL_TEXTURE_2D, 0, type, texture.sizeX, texture.sizeY, 0, type, GL_UNSIGNED_BYTE, texture.data);
- }
+ }
}
-void TextureRes::bind(){
- glBindTexture(GL_TEXTURE_2D,id);
+void TextureRes::bind()
+{
+ glBindTexture(GL_TEXTURE_2D, id);
}
TextureRes::TextureRes(const string& _filename, bool _hasMipmap, bool _hasAlpha):
- id(0),filename(_filename),hasMipmap(_hasMipmap),hasAlpha(_hasAlpha),isSkin(false),
- skinsize(0),data(NULL),datalen(0),skindata(NULL) {
+ id(0), filename(_filename), hasMipmap(_hasMipmap), hasAlpha(_hasAlpha), isSkin(false),
+ skinsize(0), data(NULL), datalen(0), skindata(NULL)
+{
load();
list.push_back(this);
}
TextureRes::TextureRes(const string& _filename, bool _hasMipmap, GLubyte* array, int* skinsizep):
- id(0),filename(_filename),hasMipmap(_hasMipmap),hasAlpha(false),isSkin(true),
- skinsize(0),data(NULL),datalen(0),skindata(NULL) {
+ id(0), filename(_filename), hasMipmap(_hasMipmap), hasAlpha(false), isSkin(true),
+ skinsize(0), data(NULL), datalen(0), skindata(NULL)
+{
load();
- *skinsizep=skinsize;
- for(int i=0;i<datalen;i++)
- array[i]=data[i];
- skindata=array;
+ *skinsizep = skinsize;
+ for (int i = 0; i < datalen; i++)
+ array[i] = data[i];
+ skindata = array;
list.push_back(this);
}
-TextureRes::~TextureRes(){
+TextureRes::~TextureRes()
+{
free(data);
- glDeleteTextures(1,&id);
- for(vector<TextureRes*>::iterator it=list.begin();it!=list.end();it++)
- if(*it==this){
+ glDeleteTextures(1, &id);
+ for (vector<TextureRes*>::iterator it = list.begin(); it != list.end(); it++)
+ if (*it == this) {
list.erase(it);
break;
}
}
-void TextureRes::reloadAll(){
- for(vector<TextureRes*>::iterator it=list.begin();it!=list.end();it++){
- (*it)->id=0;
+void TextureRes::reloadAll()
+{
+ for (vector<TextureRes*>::iterator it = list.begin(); it != list.end(); it++) {
+ (*it)->id = 0;
(*it)->load();
}
}
-void Texture::load(const string& filename, bool hasMipmap, bool hasAlpha){
+void Texture::load(const string& filename, bool hasMipmap, bool hasAlpha)
+{
destroy();
- tex=new TextureRes(filename,hasMipmap,hasAlpha);
+ tex = new TextureRes(filename, hasMipmap, hasAlpha);
}
-void Texture::load(const string& filename, bool hasMipmap, GLubyte* array, int* skinsizep){
+void Texture::load(const string& filename, bool hasMipmap, GLubyte* array, int* skinsizep)
+{
destroy();
- tex=new TextureRes(filename,hasMipmap,array,skinsizep);
+ tex = new TextureRes(filename, hasMipmap, array, skinsizep);
}
-void Texture::destroy(){
- if(tex){
+void Texture::destroy()
+{
+ if (tex) {
delete tex;
- tex=NULL;
+ tex = NULL;
}
}
-void Texture::bind(){
- if(tex)
+void Texture::bind()
+{
+ if (tex)
tex->bind();
else
- glBindTexture(GL_TEXTURE_2D,0);
+ glBindTexture(GL_TEXTURE_2D, 0);
}
-void Texture::reloadAll(){
+void Texture::reloadAll()
+{
TextureRes::reloadAll();
}
class TextureRes;
-class Texture {
+class Texture
+{
private:
TextureRes* tex;
public:
extern float slomodelay;
extern bool cellophane;
extern float texdetail;
-extern GLubyte bloodText[512*512*3];
+extern GLubyte bloodText[512 * 512 * 3];
extern int bloodtoggle;
extern Objects objects;
extern bool osx;
Model Weapon::staffmodel;
Texture Weapon::stafftextureptr;
-Weapon::Weapon(int t, int o) : owner(o) {
- setType(t);
- bloody=0;
- blooddrip=0;
- blooddripdelay=0;
- onfire=0;
- flamedelay=0;
- damage=0;
- position=-1000;
- tippoint=-1000;
+Weapon::Weapon(int t, int o) : owner(o)
+{
+ setType(t);
+ bloody = 0;
+ blooddrip = 0;
+ blooddripdelay = 0;
+ onfire = 0;
+ flamedelay = 0;
+ damage = 0;
+ position = -1000;
+ tippoint = -1000;
}
-void Weapon::setType(int t) {
- type = t;
- if(type==sword){
- mass=1.5;
- tipmass=1;
- length=.8;
- }
- if(type==staff){
- mass=2;
- tipmass=1;
- length=1.5;
- }
- if(type==knife){
- mass=1;
- tipmass=1.2;
- length=.25;
- }
+void Weapon::setType(int t)
+{
+ type = t;
+ if (type == sword) {
+ mass = 1.5;
+ tipmass = 1;
+ length = .8;
+ }
+ if (type == staff) {
+ mass = 2;
+ tipmass = 1;
+ length = 1.5;
+ }
+ if (type == knife) {
+ mass = 1;
+ tipmass = 1.2;
+ length = .25;
+ }
}
-void Weapon::DoStuff(int i) {
- //~ cout << position.x << "," << position.y << "," << position.z << "|" << tippoint.x << "," << tippoint.y << "," << tippoint.z << endl;
- static int whichpatchx,whichpatchz,whichhit;
- static XYZ start,end,colpoint,normalrot,footvel,footpoint;
- static XYZ terrainnormal;
- static XYZ vel;
- static XYZ midp;
- static XYZ newpoint1,newpoint2;
- static float friction=3.5;
- static float elasticity=.4;
- static XYZ bounceness;
- static float frictionness;
- static float closestdistance;
- static float distance;
- static XYZ point[3];
- static XYZ closestpoint;
- static XYZ closestswordpoint;
- static XYZ extramove;
- static float tempmult;
-
- if(owner!=-1) {
- oldowner=owner;
- }
- if(damage>=2 && type==staff && owner!=-1) { // the staff breaks
- emit_sound_at(staffbreaksound, tippoint);
- XYZ tempvel;
- for(int j=0;j<40;j++) {
- tempvel.x=float(abs(Random()%100)-50)/20;
- tempvel.y=float(abs(Random()%100)-50)/20;
- tempvel.z=float(abs(Random()%100)-50)/20;
- Sprite::MakeSprite(splintersprite, position+(tippoint-position)*((float)j-8)/32,tempvel*.5, 115/255,73/255,12/255, .1, 1);
- }
- if(owner!=-1) {
- player[owner].weaponactive=-1;
- player[owner].num_weapons--;
- if(player[owner].num_weapons) {
- player[owner].weaponids[0]=player[owner].weaponids[player[owner].num_weapons];
- if(player[owner].weaponstuck==player[owner].num_weapons)
- player[owner].weaponstuck=0;
- }
- }
- owner=-1;
- hitsomething=0;
- missed=1;
- freetime=0;
- firstfree=1;
- position=0;
- physics=0;
- }
- oldposition=position;
- oldtippoint=tippoint;
- if(owner==-1 && (velocity.x||velocity.y||velocity.z) && !physics) { // if the weapon is flying
- position+=velocity*multiplier;
- tippoint+=velocity*multiplier;
- whichpatchx=position.x/(terrain.size/subdivision*terrain.scale);
- whichpatchz=position.z/(terrain.size/subdivision*terrain.scale);
- if(whichpatchx>0 && whichpatchz>0 && whichpatchx<subdivision && whichpatchz<subdivision) {
- if(terrain.patchobjectnum[whichpatchx][whichpatchz]) { // if there are objects where the weapon is
- for(int j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++) { // check for collision
- int k=terrain.patchobjects[whichpatchx][whichpatchz][j];
- start=oldtippoint;
- end=tippoint;
- whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
- if(whichhit!=-1) {
- if(objects.type[k]==treetrunktype){
- objects.model[k].MakeDecal(breakdecal,DoRotation(colpoint-objects.position[k],0,-objects.yaw[k],0),.1,1,Random()%360);
- normalrot=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0);
- velocity=0;
- if(type==knife)
- position=colpoint-normalrot*.1;
- else if(type==sword)
- position=colpoint-normalrot*.2;
- else if(type==staff)
- position=colpoint-normalrot*.2;
- XYZ temppoint1,temppoint2,tempforward;
- float distance;
-
- temppoint1=0;
- temppoint2=normalrot;
- distance=findDistance(&temppoint1,&temppoint2);
- rotation2=asin((temppoint1.y-temppoint2.y)/distance);
- rotation2*=360/6.28;
- temppoint1.y=0;
- temppoint2.y=0;
- rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
- rotation1*=360/6.28;
- if(temppoint1.x>temppoint2.x)
- rotation1=360-rotation1;
-
- rotation3=0;
- smallrotation=90;
- smallrotation2=0;
- bigtilt=0;
- bigtilt2=0;
- bigrotation=0;
-
- emit_sound_at(knifesheathesound, position, 128.);
-
- bloody=0;
-
- Sprite::MakeSprite(cloudimpactsprite, position,velocity, 1,1,1, .8, .3);
- }
- else {
- physics=1;
- firstfree=1;
- position-=velocity*multiplier;
- tippoint-=velocity*multiplier;
- tipvelocity=velocity;
- }
- }
- }
- }
- }
-
- if(velocity.x||velocity.y||velocity.z) {
- for(int j=0;j<numplayers;j++) {
- footvel=0;
- footpoint=DoRotation((player[j].jointPos(abdomen)+player[j].jointPos(neck))/2,0,player[j].yaw,0)*player[j].scale+player[j].coords;
- if(owner==-1 && distsqflat(&position,&player[j].coords)<1.5 &&
- distsq(&position,&player[j].coords)<4 && player[j].weaponstuck==-1 &&
- !player[j].skeleton.free && j!=oldowner) {
- if((player[j].aitype!=attacktypecutoff||abs(Random()%6)==0||(player[j].animTarget!=backhandspringanim&&player[j].animTarget!=rollanim&&player[j].animTarget!=flipanim&&Random()%2==0))&&!missed) {
- if( (player[j].creature==wolftype && Random()%3!=0 && player[j].weaponactive==-1 && (player[j].isIdle()||player[j].isRun()||player[j].animTarget==walkanim))||
- (player[j].creature==rabbittype && Random()%2==0 && player[j].aitype==attacktypecutoff && player[j].weaponactive==-1)) {
- emit_sound_at(knifedrawsound, player[j].coords, 128.);
-
- player[j].weaponactive=0;
- player[j].animTarget=removeknifeanim;
- player[j].frameTarget=1;
- player[j].target=1;
- owner=player[j].id;
- if(player[j].num_weapons>0){
- player[j].weaponids[player[j].num_weapons]=player[j].weaponids[0];
- }
- player[j].num_weapons++;
- player[j].weaponids[0]=i;
-
- player[j].aitype=attacktypecutoff;
- }
- else {
- if(j!=0) numthrowkill++;
- player[j].num_weapons++;
- player[j].weaponstuck=player[j].num_weapons-1;
- if(normaldotproduct(player[j].facing,velocity)>0)
- player[j].weaponstuckwhere=1;
- else
- player[j].weaponstuckwhere=0;
-
- player[j].weaponids[player[j].num_weapons-1]=i;
-
- player[j].RagDoll(0);
- player[j].jointVel(abdomen)+=velocity*2;
- player[j].jointVel(neck)+=velocity*2;
- player[j].jointVel(rightshoulder)+=velocity*2;
- player[j].jointVel(leftshoulder)+=velocity*2;
- if(bloodtoggle&&tutoriallevel!=1)
- Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
- if(tutoriallevel==1)
- Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .8, .3);
- footvel=tippoint-position;
- Normalise(&footvel);
- if(bloodtoggle&&tutoriallevel!=1)
- Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*-1, 1,0,0, .6, 1);
-
- if(tutoriallevel!=1) {
- if(player[j].weaponstuckwhere==0)
- player[j].DoBloodBig(2,205);
- if(player[j].weaponstuckwhere==1)
- player[j].DoBloodBig(2,200);
- player[j].damage+=200/player[j].armorhigh;
- player[j].deathbleeding=1;
- player[j].bloodloss+=(200+abs((float)(Random()%40))-20)/player[j].armorhigh;
- owner=j;
- bloody=2;
- blooddrip=5;
- }
-
- emit_sound_at(fleshstabsound, position, 128.);
-
- if(animation[player[0].animTarget].height==highheight)
- award_bonus(0, ninja);
- else
- award_bonus(0, Bullseyebonus);
- }
- }
- else missed=1;
- }
- }
- }
- if(position.y<terrain.getHeight(position.x,position.z)) {
- if(terrain.getOpacity(position.x,position.z)<.2) {
- velocity=0;
- if(terrain.lineTerrain(oldposition,position,&colpoint)!=-1) {
- position=colpoint*terrain.scale;
- } else {
- position.y=terrain.getHeight(position.x,position.z);
- }
-
- terrain.MakeDecal(shadowdecalpermanent,position,.06,.5,0);
- normalrot=terrain.getNormal(position.x,position.z)*-1;
- velocity=0;
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- GLfloat M[16];
- glLoadIdentity();
- glRotatef(bigrotation,0,1,0);
- glRotatef(bigtilt2,1,0,0);
- glRotatef(bigtilt,0,0,1);
- glRotatef(-rotation1+90,0,1,0);
- glRotatef(-rotation2+90,0,0,1);
- glRotatef(-rotation3,0,1,0);
- glRotatef(smallrotation,1,0,0);
- glRotatef(smallrotation2,0,1,0);
- glTranslatef(0,0,1);
- glGetFloatv(GL_MODELVIEW_MATRIX,M);
- tippoint.x=M[12];
- tippoint.y=M[13];
- tippoint.z=M[14];
- glPopMatrix();
- position-=tippoint*.15;
- XYZ temppoint1,temppoint2,tempforward;
-
- rotation3=0;
- smallrotation=90;
- smallrotation2=0;
- bigtilt=0;
- bigtilt2=0;
- bigrotation=0;
-
- emit_sound_at(knifesheathesound, position, 128.);
-
- XYZ terrainlight;
- terrainlight=terrain.getLighting(position.x,position.z);
- if(environment==snowyenvironment){
- if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7);
- }
- else if(environment==grassyenvironment){
- if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5);
- }
- else if(environment==desertenvironment){
- if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7);
- }
-
- bloody=0;
- }
- else {
- physics=1;
- firstfree=1;
- position-=velocity*multiplier;
- tippoint-=velocity*multiplier;
- tipvelocity=velocity;
- }
- }
- if(velocity.x!=0||velocity.z!=0||velocity.y!=0) {
- velocity.y+=gravity*multiplier;
-
- XYZ temppoint1,temppoint2,tempforward;
- float distance;
-
- temppoint1=0;
- temppoint2=velocity;
- distance=findDistance(&temppoint1,&temppoint2);
- rotation2=asin((temppoint1.y-temppoint2.y)/distance);
- rotation2*=360/6.28;
- temppoint1.y=0;
- temppoint2.y=0;
- rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
- rotation1*=360/6.28;
- rotation3=0;
- smallrotation=90;
- smallrotation2=0;
- bigtilt=0;
- bigtilt2=0;
- bigrotation=0;
- if(temppoint1.x>temppoint2.x) rotation1=360-rotation1;
- }
-
- }
-
- //Sword physics
- XYZ mid;
- XYZ oldmid;
- XYZ oldmid2;
-
- tempmult=multiplier;
- multiplier/=10;
- for(int l=0;l<10;l++) {
- if(owner==-1&&(velocity.x||velocity.y||velocity.z)&&physics) {
- //move
- position+=velocity*multiplier;
- tippoint+=tipvelocity*multiplier;
-
- //Length constrain
- midp=(position*mass+tippoint*tipmass)/(mass+tipmass);
- vel=tippoint-midp;
- Normalise(&vel);
- newpoint1=midp-vel*length*(tipmass/(mass+tipmass));
- newpoint2=midp+vel*length*(mass/(mass+tipmass));
- if(!freeze){
- if(freetime>.04) {
- velocity=velocity+(newpoint1-position)/multiplier;
- tipvelocity=tipvelocity+(newpoint2-tippoint)/multiplier;
- }
- }
- position=newpoint1;
- tippoint=newpoint2;
-
-
- //Object collisions
- whichpatchx=(position.x)/(terrain.size/subdivision*terrain.scale);
- whichpatchz=(position.z)/(terrain.size/subdivision*terrain.scale);
- if(whichpatchx>0&&whichpatchz>0&&whichpatchx<subdivision&&whichpatchz<subdivision)
- if(terrain.patchobjectnum[whichpatchx][whichpatchz]) {
- for(int j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++) {
- int k=terrain.patchobjects[whichpatchx][whichpatchz][j];
-
- if(firstfree) {
- if(type==staff) {
- start=tippoint-(position-tippoint)/5;
- end=position+(position-tippoint)/30;
- whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
- if(whichhit!=-1) {
- XYZ diff;
- diff=(colpoint-position);
- Normalise(&diff);
- hitsomething=1;
-
- tippoint+=(colpoint-position)+diff*.05;
- position=colpoint+diff*.05;
- oldtippoint=tippoint;
- oldposition=tippoint;
- }
- } else {
- start=position-(tippoint-position)/5;
- end=tippoint+(tippoint-position)/30;
- whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
- if(whichhit!=-1){
- XYZ diff;
- diff=(colpoint-tippoint);
- Normalise(&diff);
- hitsomething=1;
-
- position+=(colpoint-tippoint)+diff*.05;
- tippoint=colpoint+diff*.05;
- oldposition=position;
- oldtippoint=tippoint;
- }
- }
- }
-
- start=oldposition;
- end=position;
- whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
- if(whichhit!=-1) {
- hitsomething=1;
- position=colpoint;
- terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0)*-1;
- ReflectVector(&velocity,&terrainnormal);
- position+=terrainnormal*.002;
-
- bounceness=terrainnormal*findLength(&velocity)*(abs(normaldotproduct(velocity,terrainnormal)));
- if(findLengthfast(&velocity)<findLengthfast(&bounceness))
- bounceness=0;
- frictionness=abs(normaldotproduct(velocity,terrainnormal));
- velocity-=bounceness;
- if(1-friction*frictionness>0)velocity*=1-friction*frictionness;
- else velocity=0;
- velocity+=bounceness*elasticity;
-
- if(findLengthfast(&bounceness)>1) {
- int whichsound;
- if(type==staff)
- whichsound=footstepsound3+abs(Random()%2);
- else
- whichsound=clank1sound+abs(Random()%4);
- emit_sound_at(whichsound, position, 128*findLengthfast(&bounceness));
- }
- }
- start=oldtippoint;
- end=tippoint;
- whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
- if(whichhit!=-1) {
- hitsomething=1;
- tippoint=colpoint;
- terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0)*-1;
- ReflectVector(&tipvelocity,&terrainnormal);
- tippoint+=terrainnormal*.002;
-
- bounceness=terrainnormal*findLength(&tipvelocity)*(abs(normaldotproduct(tipvelocity,terrainnormal)));
- if(findLengthfast(&tipvelocity)<findLengthfast(&bounceness))bounceness=0;
- frictionness=abs(normaldotproduct(tipvelocity,terrainnormal));
- tipvelocity-=bounceness;
- if(1-friction*frictionness>0)tipvelocity*=1-friction*frictionness;
- else tipvelocity=0;
- tipvelocity+=bounceness*elasticity;
-
- if(findLengthfast(&bounceness)>1){
- int whichsound;
- if(type==staff)
- whichsound=footstepsound3+abs(Random()%2);
- else
- whichsound=clank1sound+abs(Random()%4);
- emit_sound_at(whichsound, position, 128*findLengthfast(&bounceness));
- }
- }
-
- if((objects.type[k]!=boxtype && objects.type[k]!=platformtype && objects.type[k]!=walltype && objects.type[k]!=weirdtype)||objects.pitch[k]!=0)
- for(int m=0;m<2;m++){
- mid=(position*(21+(float)m*10)+tippoint*(19-(float)m*10))/40;
- oldmid2=mid;
- oldmid=(oldposition*(21+(float)m*10)+oldtippoint*(19-(float)m*10))/40;
-
- start=oldmid;
- end=mid;
- whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
- if(whichhit!=-1) {
- hitsomething=1;
- mid=colpoint;
- terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0)*-1;
- ReflectVector(&velocity,&terrainnormal);
-
- bounceness=terrainnormal*findLength(&velocity)*(abs(normaldotproduct(velocity,terrainnormal)));
- if(findLengthfast(&velocity)<findLengthfast(&bounceness))bounceness=0;
- frictionness=abs(normaldotproduct(velocity,terrainnormal));
- velocity-=bounceness;
- if(1-friction*frictionness>0)velocity*=1-friction*frictionness;
- else velocity=0;
- velocity+=bounceness*elasticity;
-
- if(findLengthfast(&bounceness)>1){
- int whichsound;
- if(type==staff)
- whichsound=footstepsound3+abs(Random()%2);
- else
- whichsound=clank1sound+abs(Random()%4);
- emit_sound_at(whichsound, mid, 128*findLengthfast(&bounceness));
- }
- position+=(mid-oldmid2)*(20/(1+(float)m*10));
- }
-
- mid=(position*(19-(float)m*10)+tippoint*(21+(float)m*10))/40;
- oldmid2=mid;
- oldmid=(oldposition*(19-(float)m*10)+oldtippoint*(21+(float)m*10))/40;
-
- start=oldmid;
- end=mid;
- whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
- if(whichhit!=-1) {
- hitsomething=1;
- mid=colpoint;
- terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0)*-1;
- ReflectVector(&tipvelocity,&terrainnormal);
-
- bounceness=terrainnormal*findLength(&tipvelocity)*(abs(normaldotproduct(tipvelocity,terrainnormal)));
- if(findLengthfast(&tipvelocity)<findLengthfast(&bounceness))bounceness=0;
- frictionness=abs(normaldotproduct(tipvelocity,terrainnormal));
- tipvelocity-=bounceness;
- if(1-friction*frictionness>0)tipvelocity*=1-friction*frictionness;
- else tipvelocity=0;
- tipvelocity+=bounceness*elasticity;
-
- if(findLengthfast(&bounceness)>1){
- int whichsound;
- if(type==staff)
- whichsound=footstepsound3+abs(Random()%2);
- else
- whichsound=clank1sound+abs(Random()%4);
- emit_sound_at(whichsound, mid, 128*findLengthfast(&bounceness));
- }
- tippoint+=(mid-oldmid2)*(20/(1+(float)m*10));
- }
- }
- else
- {
- start=position;
- end=tippoint;
- whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
- if(whichhit!=-1) {
- hitsomething=1;
- closestdistance=-1;
- closestswordpoint=colpoint;//(position+tippoint)/2;
- point[0]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[0]],0,objects.yaw[k],0)+objects.position[k];
- point[1]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[1]],0,objects.yaw[k],0)+objects.position[k];
- point[2]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[2]],0,objects.yaw[k],0)+objects.position[k];
- if(DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance,&colpoint )) {
- if(distance<closestdistance||closestdistance==-1){
- closestpoint=colpoint;
- closestdistance=distance;
- }
- }
- if(DistancePointLine(&closestswordpoint, &point[1], &point[2], &distance,&colpoint )) {
- if(distance<closestdistance||closestdistance==-1){
- closestpoint=colpoint;
- closestdistance=distance;
- }
- }
- if(DistancePointLine(&closestswordpoint, &point[2], &point[0], &distance,&colpoint )) {
- if(distance<closestdistance||closestdistance==-1){
- closestpoint=colpoint;
- closestdistance=distance;
- }
- }
- if(closestdistance!=-1 && isnormal(closestdistance)) {
- if(DistancePointLine(&closestpoint, &position, &tippoint, &distance,&colpoint )) {
- closestswordpoint=colpoint;
- velocity+=(closestpoint-closestswordpoint);
- tipvelocity+=(closestpoint-closestswordpoint);
- position+=(closestpoint-closestswordpoint);
- tippoint+=(closestpoint-closestswordpoint);
- }
- }
- }
- }
- }
- }
- //Terrain collisions
- whichhit=terrain.lineTerrain(oldposition,position,&colpoint);
- if(whichhit!=-1||position.y<terrain.getHeight(position.x,position.z)) {
- hitsomething=1;
- if(whichhit!=-1)
- position=colpoint*terrain.scale;
- else
- position.y=terrain.getHeight(position.x,position.z);
-
- terrainnormal=terrain.getNormal(position.x,position.z);
- ReflectVector(&velocity,&terrainnormal);
- position+=terrainnormal*.002;
- bounceness=terrainnormal*findLength(&velocity)*(abs(normaldotproduct(velocity,terrainnormal)));
- if(findLengthfast(&velocity)<findLengthfast(&bounceness))bounceness=0;
- frictionness=abs(normaldotproduct(velocity,terrainnormal));
- velocity-=bounceness;
- if(1-friction*frictionness>0)velocity*=1-friction*frictionness;
- else velocity=0;
- if(terrain.getOpacity(position.x,position.z)<.2)velocity+=bounceness*elasticity*.3;
- else velocity+=bounceness*elasticity;
-
- if(findLengthfast(&bounceness)>1) {
- int whichsound;
- if(terrain.getOpacity(position.x,position.z)>.2){
- if(type==staff)
- whichsound=footstepsound3+abs(Random()%2);
- else
- whichsound=clank1sound+abs(Random()%4);
- } else {
- whichsound=footstepsound+abs(Random()%2);
- }
- emit_sound_at(whichsound, position,
- findLengthfast(&bounceness)
- * (terrain.getOpacity(position.x,position.z) > .2 ? 128. : 32.));
-
- if(terrain.getOpacity(position.x,position.z)<.2) {
- XYZ terrainlight;
- terrainlight=terrain.getLighting(position.x,position.z);
- if(environment==snowyenvironment){
- if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7);
- }
- else if(environment==grassyenvironment){
- if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5);
- }
- else if(environment==desertenvironment){
- if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7);
- }
- }
- }
- }
- whichhit=terrain.lineTerrain(oldtippoint,tippoint,&colpoint);
- if(whichhit!=-1||tippoint.y<terrain.getHeight(tippoint.x,tippoint.z)) {
- if(whichhit!=-1)
- tippoint=colpoint*terrain.scale;
- else
- tippoint.y=terrain.getHeight(tippoint.x,tippoint.z);
-
- terrainnormal=terrain.getNormal(tippoint.x,tippoint.z);
- ReflectVector(&tipvelocity,&terrainnormal);
- tippoint+=terrainnormal*.002;
- bounceness=terrainnormal*findLength(&tipvelocity)*(abs(normaldotproduct(tipvelocity,terrainnormal)));
- if(findLengthfast(&tipvelocity)<findLengthfast(&bounceness))bounceness=0;
- frictionness=abs(normaldotproduct(tipvelocity,terrainnormal));
- tipvelocity-=bounceness;
- if(1-friction*frictionness>0)tipvelocity*=1-friction*frictionness;
- else tipvelocity=0;
- if(terrain.getOpacity(tippoint.x,tippoint.z)<.2)tipvelocity+=bounceness*elasticity*.3;
- else tipvelocity+=bounceness*elasticity;
-
- if(findLengthfast(&bounceness)>1){
- int whichsound;
- if(terrain.getOpacity(tippoint.x,tippoint.z)>.2){
- if(type==staff)
- whichsound=footstepsound3+abs(Random()%2);
- else
- whichsound=clank1sound+abs(Random()%4);
- } else {
- whichsound=footstepsound+abs(Random()%2);
- }
- emit_sound_at(whichsound, tippoint,
- findLengthfast(&bounceness)
- * (terrain.getOpacity(tippoint.x,tippoint.z) > .2 ? 128. : 32.));
-
- if(terrain.getOpacity(tippoint.x,tippoint.z)<.2) {
- XYZ terrainlight;
- terrainlight=terrain.getLighting(tippoint.x,tippoint.z);
- if(environment==snowyenvironment){
- if(distsq(&tippoint,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, tippoint,tipvelocity, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7);
- }
- else if(environment==grassyenvironment){
- if(distsq(&tippoint,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, tippoint,tipvelocity, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5);
- }
- else if(environment==desertenvironment){
- if(distsq(&tippoint,&viewer)<viewdistance*viewdistance/4)
- Sprite::MakeSprite(cloudsprite, tippoint,tipvelocity, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7);
- }
- }
- }
- }
-
- //Edges
- mid=position+tippoint;
- mid/=2;
- mid+=(position-mid)/20;
- oldmid=mid;
- if(mid.y<terrain.getHeight(mid.x,mid.z)){
- hitsomething=1;
- mid.y=terrain.getHeight(mid.x,mid.z);
-
- terrainnormal=terrain.getNormal(mid.x,mid.z);
- ReflectVector(&velocity,&terrainnormal);
- //mid+=terrainnormal*.002;
- bounceness=terrainnormal*findLength(&velocity)*(abs(normaldotproduct(velocity,terrainnormal)));
- if(findLengthfast(&velocity)<findLengthfast(&bounceness))bounceness=0;
- frictionness=abs(normaldotproduct(velocity,terrainnormal));
- velocity-=bounceness;
- if(1-friction*frictionness>0)velocity*=1-friction*frictionness;
- else velocity=0;
- if(terrain.getOpacity(mid.x,mid.z)<.2)velocity+=bounceness*elasticity*.3;
- else velocity+=bounceness*elasticity;
-
- if(findLengthfast(&bounceness)>1){
- int whichsound;
- if(terrain.getOpacity(mid.x,mid.z)>.2){
- if(type==staff)whichsound=footstepsound3+abs(Random()%2);
- if(type!=staff)whichsound=clank1sound+abs(Random()%4);
- }
- else whichsound=footstepsound+abs(Random()%2);
- emit_sound_at(whichsound, mid,
- findLengthfast(&bounceness)
- * (terrain.getOpacity(position.x,position.z) > .2
- ? 128.
- : 32.));
- }
- position+=(mid-oldmid)*20;
- }
-
- mid=position+tippoint;
- mid/=2;
- mid+=(tippoint-mid)/20;
- oldmid=mid;
- if(mid.y<terrain.getHeight(mid.x,mid.z)){
- hitsomething=1;
- mid.y=terrain.getHeight(mid.x,mid.z);
-
- terrainnormal=terrain.getNormal(mid.x,mid.z);
- ReflectVector(&tipvelocity,&terrainnormal);
- //mid+=terrainnormal*.002;
- bounceness=terrainnormal*findLength(&tipvelocity)*(abs(normaldotproduct(tipvelocity,terrainnormal)));
- if(findLengthfast(&tipvelocity)<findLengthfast(&bounceness))bounceness=0;
- frictionness=abs(normaldotproduct(tipvelocity,terrainnormal));
- tipvelocity-=bounceness;
- if(1-friction*frictionness>0)tipvelocity*=1-friction*frictionness;
- else tipvelocity=0;
- if(terrain.getOpacity(mid.x,mid.z)<.2)tipvelocity+=bounceness*elasticity*.3;
- else tipvelocity+=bounceness*elasticity;
-
- if(findLengthfast(&bounceness)>1){
- int whichsound;
- if(terrain.getOpacity(mid.x,mid.z)>.2){
- if(type==staff)whichsound=footstepsound3+abs(Random()%2);
- if(type!=staff)whichsound=clank1sound+abs(Random()%4);
- }
- else whichsound=footstepsound+abs(Random()%2);
- emit_sound_at(whichsound, mid,
- findLengthfast(&bounceness)
- * (terrain.getOpacity(position.x,position.z) > .2
- ? 128.
- : 32.));
- }
- tippoint+=(mid-oldmid)*20;
- }
- //Gravity
- velocity.y+=gravity*multiplier;
- tipvelocity.y+=gravity*multiplier;
-
- //Rotation
- XYZ temppoint1,temppoint2,tempforward;
- float distance;
-
- temppoint1=position;
- temppoint2=tippoint;
- distance=findDistance(&temppoint1,&temppoint2);
- rotation2=asin((temppoint1.y-temppoint2.y)/distance);
- rotation2*=360/6.28;
- temppoint1.y=0;
- temppoint2.y=0;
- rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
- rotation1*=360/6.28;
- rotation3=0;
- smallrotation=90;
- smallrotation2=0;
- bigtilt=0;
- bigtilt2=0;
- bigrotation=0;
- if(temppoint1.x>temppoint2.x)rotation1=360-rotation1;
-
- //Stop moving
- if(findLengthfast(&velocity)<.3&&findLengthfast(&tipvelocity)<.3&&hitsomething){
- freetime+=multiplier;
- }
-
- if(freetime>.4){
- velocity=0;
- tipvelocity=0;
- }
- firstfree=0;
- }
- }
- multiplier=tempmult;
- if(blooddrip && bloody) {
- blooddripdelay-=blooddrip*multiplier/2;
- blooddrip-=multiplier;
- if(blooddrip<0) blooddrip=0;
- if(blooddrip>5) blooddrip=5;
- if(blooddripdelay<0 && bloodtoggle) {
- blooddripdelay=1;
- XYZ bloodvel;
- XYZ bloodloc;
- bloodloc=position+(tippoint-position)*.7;
- bloodloc.y-=.05;
- if(bloodtoggle) {
- bloodvel=0;
- Sprite::MakeSprite(bloodsprite, bloodloc,bloodvel, 1,1,1, .03, 1);
- }
- }
- }
- if(onfire) {
- flamedelay-=multiplier;
- if(onfire&&flamedelay<=0) {
- flamedelay=.020;
- flamedelay-=multiplier;
- normalrot=0;
- if(owner!=-1) {
- normalrot=player[owner].velocity;
- }
- normalrot.y+=1;
- if(owner!=-1) {
- if(player[owner].onterrain) {
- normalrot.y=1;
- }
- }
- Sprite::MakeSprite(weaponflamesprite, position+tippoint*(((float)abs(Random()%100))/600+.05),normalrot, 1,1,1, (.6+(float)abs(Random()%100)/200-.25)*1/3, 1);
- Sprite::setLastSpriteSpeed(4);
- Sprite::setLastSpriteAlivetime(.3);
- }
- }
-
- if(!onfire && owner==-1 && type!=staff) {
- flamedelay-=multiplier;
- if(flamedelay<=0) {
- flamedelay=.020;
- flamedelay-=multiplier;
- normalrot=0;
- if(Random()%50==0&&distsq(&position,&viewer)>80) {
- XYZ shinepoint;
- shinepoint=position+(tippoint-position)*(((float)abs(Random()%100))/100);
- Sprite::MakeSprite(weaponshinesprite, shinepoint,normalrot, 1,1,1, (.1+(float)abs(Random()%100)/200-.25)*1/3*fast_sqrt(findDistance(&shinepoint,&viewer)), 1);
- Sprite::setLastSpriteSpeed(4);
- Sprite::setLastSpriteAlivetime(.3);
- }
- }
- }
+void Weapon::DoStuff(int i)
+{
+ //~ cout << position.x << "," << position.y << "," << position.z << "|" << tippoint.x << "," << tippoint.y << "," << tippoint.z << endl;
+ static int whichpatchx, whichpatchz, whichhit;
+ static XYZ start, end, colpoint, normalrot, footvel, footpoint;
+ static XYZ terrainnormal;
+ static XYZ vel;
+ static XYZ midp;
+ static XYZ newpoint1, newpoint2;
+ static float friction = 3.5;
+ static float elasticity = .4;
+ static XYZ bounceness;
+ static float frictionness;
+ static float closestdistance;
+ static float distance;
+ static XYZ point[3];
+ static XYZ closestpoint;
+ static XYZ closestswordpoint;
+ static XYZ extramove;
+ static float tempmult;
+
+ if (owner != -1) {
+ oldowner = owner;
+ }
+ if (damage >= 2 && type == staff && owner != -1) { // the staff breaks
+ emit_sound_at(staffbreaksound, tippoint);
+ XYZ tempvel;
+ for (int j = 0; j < 40; j++) {
+ tempvel.x = float(abs(Random() % 100) - 50) / 20;
+ tempvel.y = float(abs(Random() % 100) - 50) / 20;
+ tempvel.z = float(abs(Random() % 100) - 50) / 20;
+ Sprite::MakeSprite(splintersprite, position + (tippoint - position) * ((float)j - 8) / 32, tempvel * .5, 115 / 255, 73 / 255, 12 / 255, .1, 1);
+ }
+ if (owner != -1) {
+ player[owner].weaponactive = -1;
+ player[owner].num_weapons--;
+ if (player[owner].num_weapons) {
+ player[owner].weaponids[0] = player[owner].weaponids[player[owner].num_weapons];
+ if (player[owner].weaponstuck == player[owner].num_weapons)
+ player[owner].weaponstuck = 0;
+ }
+ }
+ owner = -1;
+ hitsomething = 0;
+ missed = 1;
+ freetime = 0;
+ firstfree = 1;
+ position = 0;
+ physics = 0;
+ }
+ oldposition = position;
+ oldtippoint = tippoint;
+ if (owner == -1 && (velocity.x || velocity.y || velocity.z) && !physics) { // if the weapon is flying
+ position += velocity * multiplier;
+ tippoint += velocity * multiplier;
+ whichpatchx = position.x / (terrain.size / subdivision * terrain.scale);
+ whichpatchz = position.z / (terrain.size / subdivision * terrain.scale);
+ if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) {
+ if (terrain.patchobjectnum[whichpatchx][whichpatchz]) { // if there are objects where the weapon is
+ for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) { // check for collision
+ int k = terrain.patchobjects[whichpatchx][whichpatchz][j];
+ start = oldtippoint;
+ end = tippoint;
+ whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+ if (whichhit != -1) {
+ if (objects.type[k] == treetrunktype) {
+ objects.model[k].MakeDecal(breakdecal, DoRotation(colpoint - objects.position[k], 0, -objects.yaw[k], 0), .1, 1, Random() % 360);
+ normalrot = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0);
+ velocity = 0;
+ if (type == knife)
+ position = colpoint - normalrot * .1;
+ else if (type == sword)
+ position = colpoint - normalrot * .2;
+ else if (type == staff)
+ position = colpoint - normalrot * .2;
+ XYZ temppoint1, temppoint2, tempforward;
+ float distance;
+
+ temppoint1 = 0;
+ temppoint2 = normalrot;
+ distance = findDistance(&temppoint1, &temppoint2);
+ rotation2 = asin((temppoint1.y - temppoint2.y) / distance);
+ rotation2 *= 360 / 6.28;
+ temppoint1.y = 0;
+ temppoint2.y = 0;
+ rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2));
+ rotation1 *= 360 / 6.28;
+ if (temppoint1.x > temppoint2.x)
+ rotation1 = 360 - rotation1;
+
+ rotation3 = 0;
+ smallrotation = 90;
+ smallrotation2 = 0;
+ bigtilt = 0;
+ bigtilt2 = 0;
+ bigrotation = 0;
+
+ emit_sound_at(knifesheathesound, position, 128.);
+
+ bloody = 0;
+
+ Sprite::MakeSprite(cloudimpactsprite, position, velocity, 1, 1, 1, .8, .3);
+ } else {
+ physics = 1;
+ firstfree = 1;
+ position -= velocity * multiplier;
+ tippoint -= velocity * multiplier;
+ tipvelocity = velocity;
+ }
+ }
+ }
+ }
+ }
+
+ if (velocity.x || velocity.y || velocity.z) {
+ for (int j = 0; j < numplayers; j++) {
+ footvel = 0;
+ footpoint = DoRotation((player[j].jointPos(abdomen) + player[j].jointPos(neck)) / 2, 0, player[j].yaw, 0) * player[j].scale + player[j].coords;
+ if (owner == -1 && distsqflat(&position, &player[j].coords) < 1.5 &&
+ distsq(&position, &player[j].coords) < 4 && player[j].weaponstuck == -1 &&
+ !player[j].skeleton.free && j != oldowner) {
+ if ((player[j].aitype != attacktypecutoff || abs(Random() % 6) == 0 || (player[j].animTarget != backhandspringanim && player[j].animTarget != rollanim && player[j].animTarget != flipanim && Random() % 2 == 0)) && !missed) {
+ if ( (player[j].creature == wolftype && Random() % 3 != 0 && player[j].weaponactive == -1 && (player[j].isIdle() || player[j].isRun() || player[j].animTarget == walkanim)) ||
+ (player[j].creature == rabbittype && Random() % 2 == 0 && player[j].aitype == attacktypecutoff && player[j].weaponactive == -1)) {
+ emit_sound_at(knifedrawsound, player[j].coords, 128.);
+
+ player[j].weaponactive = 0;
+ player[j].animTarget = removeknifeanim;
+ player[j].frameTarget = 1;
+ player[j].target = 1;
+ owner = player[j].id;
+ if (player[j].num_weapons > 0) {
+ player[j].weaponids[player[j].num_weapons] = player[j].weaponids[0];
+ }
+ player[j].num_weapons++;
+ player[j].weaponids[0] = i;
+
+ player[j].aitype = attacktypecutoff;
+ } else {
+ if (j != 0) numthrowkill++;
+ player[j].num_weapons++;
+ player[j].weaponstuck = player[j].num_weapons - 1;
+ if (normaldotproduct(player[j].facing, velocity) > 0)
+ player[j].weaponstuckwhere = 1;
+ else
+ player[j].weaponstuckwhere = 0;
+
+ player[j].weaponids[player[j].num_weapons - 1] = i;
+
+ player[j].RagDoll(0);
+ player[j].jointVel(abdomen) += velocity * 2;
+ player[j].jointVel(neck) += velocity * 2;
+ player[j].jointVel(rightshoulder) += velocity * 2;
+ player[j].jointVel(leftshoulder) += velocity * 2;
+ if (bloodtoggle && tutoriallevel != 1)
+ Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .8, .3);
+ if (tutoriallevel == 1)
+ Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .8, .3);
+ footvel = tippoint - position;
+ Normalise(&footvel);
+ if (bloodtoggle && tutoriallevel != 1)
+ Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * -1, 1, 0, 0, .6, 1);
+
+ if (tutoriallevel != 1) {
+ if (player[j].weaponstuckwhere == 0)
+ player[j].DoBloodBig(2, 205);
+ if (player[j].weaponstuckwhere == 1)
+ player[j].DoBloodBig(2, 200);
+ player[j].damage += 200 / player[j].armorhigh;
+ player[j].deathbleeding = 1;
+ player[j].bloodloss += (200 + abs((float)(Random() % 40)) - 20) / player[j].armorhigh;
+ owner = j;
+ bloody = 2;
+ blooddrip = 5;
+ }
+
+ emit_sound_at(fleshstabsound, position, 128.);
+
+ if (animation[player[0].animTarget].height == highheight)
+ award_bonus(0, ninja);
+ else
+ award_bonus(0, Bullseyebonus);
+ }
+ } else missed = 1;
+ }
+ }
+ }
+ if (position.y < terrain.getHeight(position.x, position.z)) {
+ if (terrain.getOpacity(position.x, position.z) < .2) {
+ velocity = 0;
+ if (terrain.lineTerrain(oldposition, position, &colpoint) != -1) {
+ position = colpoint * terrain.scale;
+ } else {
+ position.y = terrain.getHeight(position.x, position.z);
+ }
+
+ terrain.MakeDecal(shadowdecalpermanent, position, .06, .5, 0);
+ normalrot = terrain.getNormal(position.x, position.z) * -1;
+ velocity = 0;
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ GLfloat M[16];
+ glLoadIdentity();
+ glRotatef(bigrotation, 0, 1, 0);
+ glRotatef(bigtilt2, 1, 0, 0);
+ glRotatef(bigtilt, 0, 0, 1);
+ glRotatef(-rotation1 + 90, 0, 1, 0);
+ glRotatef(-rotation2 + 90, 0, 0, 1);
+ glRotatef(-rotation3, 0, 1, 0);
+ glRotatef(smallrotation, 1, 0, 0);
+ glRotatef(smallrotation2, 0, 1, 0);
+ glTranslatef(0, 0, 1);
+ glGetFloatv(GL_MODELVIEW_MATRIX, M);
+ tippoint.x = M[12];
+ tippoint.y = M[13];
+ tippoint.z = M[14];
+ glPopMatrix();
+ position -= tippoint * .15;
+ XYZ temppoint1, temppoint2, tempforward;
+
+ rotation3 = 0;
+ smallrotation = 90;
+ smallrotation2 = 0;
+ bigtilt = 0;
+ bigtilt2 = 0;
+ bigrotation = 0;
+
+ emit_sound_at(knifesheathesound, position, 128.);
+
+ XYZ terrainlight;
+ terrainlight = terrain.getLighting(position.x, position.z);
+ if (environment == snowyenvironment) {
+ if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7);
+ } else if (environment == grassyenvironment) {
+ if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5);
+ } else if (environment == desertenvironment) {
+ if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7);
+ }
+
+ bloody = 0;
+ } else {
+ physics = 1;
+ firstfree = 1;
+ position -= velocity * multiplier;
+ tippoint -= velocity * multiplier;
+ tipvelocity = velocity;
+ }
+ }
+ if (velocity.x != 0 || velocity.z != 0 || velocity.y != 0) {
+ velocity.y += gravity * multiplier;
+
+ XYZ temppoint1, temppoint2, tempforward;
+ float distance;
+
+ temppoint1 = 0;
+ temppoint2 = velocity;
+ distance = findDistance(&temppoint1, &temppoint2);
+ rotation2 = asin((temppoint1.y - temppoint2.y) / distance);
+ rotation2 *= 360 / 6.28;
+ temppoint1.y = 0;
+ temppoint2.y = 0;
+ rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2));
+ rotation1 *= 360 / 6.28;
+ rotation3 = 0;
+ smallrotation = 90;
+ smallrotation2 = 0;
+ bigtilt = 0;
+ bigtilt2 = 0;
+ bigrotation = 0;
+ if (temppoint1.x > temppoint2.x) rotation1 = 360 - rotation1;
+ }
+
+ }
+
+ //Sword physics
+ XYZ mid;
+ XYZ oldmid;
+ XYZ oldmid2;
+
+ tempmult = multiplier;
+ multiplier /= 10;
+ for (int l = 0; l < 10; l++) {
+ if (owner == -1 && (velocity.x || velocity.y || velocity.z) && physics) {
+ //move
+ position += velocity * multiplier;
+ tippoint += tipvelocity * multiplier;
+
+ //Length constrain
+ midp = (position * mass + tippoint * tipmass) / (mass + tipmass);
+ vel = tippoint - midp;
+ Normalise(&vel);
+ newpoint1 = midp - vel * length * (tipmass / (mass + tipmass));
+ newpoint2 = midp + vel * length * (mass / (mass + tipmass));
+ if (!freeze) {
+ if (freetime > .04) {
+ velocity = velocity + (newpoint1 - position) / multiplier;
+ tipvelocity = tipvelocity + (newpoint2 - tippoint) / multiplier;
+ }
+ }
+ position = newpoint1;
+ tippoint = newpoint2;
+
+
+ //Object collisions
+ whichpatchx = (position.x) / (terrain.size / subdivision * terrain.scale);
+ whichpatchz = (position.z) / (terrain.size / subdivision * terrain.scale);
+ if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision)
+ if (terrain.patchobjectnum[whichpatchx][whichpatchz]) {
+ for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) {
+ int k = terrain.patchobjects[whichpatchx][whichpatchz][j];
+
+ if (firstfree) {
+ if (type == staff) {
+ start = tippoint - (position - tippoint) / 5;
+ end = position + (position - tippoint) / 30;
+ whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+ if (whichhit != -1) {
+ XYZ diff;
+ diff = (colpoint - position);
+ Normalise(&diff);
+ hitsomething = 1;
+
+ tippoint += (colpoint - position) + diff * .05;
+ position = colpoint + diff * .05;
+ oldtippoint = tippoint;
+ oldposition = tippoint;
+ }
+ } else {
+ start = position - (tippoint - position) / 5;
+ end = tippoint + (tippoint - position) / 30;
+ whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+ if (whichhit != -1) {
+ XYZ diff;
+ diff = (colpoint - tippoint);
+ Normalise(&diff);
+ hitsomething = 1;
+
+ position += (colpoint - tippoint) + diff * .05;
+ tippoint = colpoint + diff * .05;
+ oldposition = position;
+ oldtippoint = tippoint;
+ }
+ }
+ }
+
+ start = oldposition;
+ end = position;
+ whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+ if (whichhit != -1) {
+ hitsomething = 1;
+ position = colpoint;
+ terrainnormal = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0) * -1;
+ ReflectVector(&velocity, &terrainnormal);
+ position += terrainnormal * .002;
+
+ bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal)));
+ if (findLengthfast(&velocity) < findLengthfast(&bounceness))
+ bounceness = 0;
+ frictionness = abs(normaldotproduct(velocity, terrainnormal));
+ velocity -= bounceness;
+ if (1 - friction * frictionness > 0)velocity *= 1 - friction * frictionness;
+ else velocity = 0;
+ velocity += bounceness * elasticity;
+
+ if (findLengthfast(&bounceness) > 1) {
+ int whichsound;
+ if (type == staff)
+ whichsound = footstepsound3 + abs(Random() % 2);
+ else
+ whichsound = clank1sound + abs(Random() % 4);
+ emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness));
+ }
+ }
+ start = oldtippoint;
+ end = tippoint;
+ whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+ if (whichhit != -1) {
+ hitsomething = 1;
+ tippoint = colpoint;
+ terrainnormal = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0) * -1;
+ ReflectVector(&tipvelocity, &terrainnormal);
+ tippoint += terrainnormal * .002;
+
+ bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal)));
+ if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness))bounceness = 0;
+ frictionness = abs(normaldotproduct(tipvelocity, terrainnormal));
+ tipvelocity -= bounceness;
+ if (1 - friction * frictionness > 0)tipvelocity *= 1 - friction * frictionness;
+ else tipvelocity = 0;
+ tipvelocity += bounceness * elasticity;
+
+ if (findLengthfast(&bounceness) > 1) {
+ int whichsound;
+ if (type == staff)
+ whichsound = footstepsound3 + abs(Random() % 2);
+ else
+ whichsound = clank1sound + abs(Random() % 4);
+ emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness));
+ }
+ }
+
+ if ((objects.type[k] != boxtype && objects.type[k] != platformtype && objects.type[k] != walltype && objects.type[k] != weirdtype) || objects.pitch[k] != 0)
+ for (int m = 0; m < 2; m++) {
+ mid = (position * (21 + (float)m * 10) + tippoint * (19 - (float)m * 10)) / 40;
+ oldmid2 = mid;
+ oldmid = (oldposition * (21 + (float)m * 10) + oldtippoint * (19 - (float)m * 10)) / 40;
+
+ start = oldmid;
+ end = mid;
+ whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+ if (whichhit != -1) {
+ hitsomething = 1;
+ mid = colpoint;
+ terrainnormal = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0) * -1;
+ ReflectVector(&velocity, &terrainnormal);
+
+ bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal)));
+ if (findLengthfast(&velocity) < findLengthfast(&bounceness))bounceness = 0;
+ frictionness = abs(normaldotproduct(velocity, terrainnormal));
+ velocity -= bounceness;
+ if (1 - friction * frictionness > 0)velocity *= 1 - friction * frictionness;
+ else velocity = 0;
+ velocity += bounceness * elasticity;
+
+ if (findLengthfast(&bounceness) > 1) {
+ int whichsound;
+ if (type == staff)
+ whichsound = footstepsound3 + abs(Random() % 2);
+ else
+ whichsound = clank1sound + abs(Random() % 4);
+ emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness));
+ }
+ position += (mid - oldmid2) * (20 / (1 + (float)m * 10));
+ }
+
+ mid = (position * (19 - (float)m * 10) + tippoint * (21 + (float)m * 10)) / 40;
+ oldmid2 = mid;
+ oldmid = (oldposition * (19 - (float)m * 10) + oldtippoint * (21 + (float)m * 10)) / 40;
+
+ start = oldmid;
+ end = mid;
+ whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+ if (whichhit != -1) {
+ hitsomething = 1;
+ mid = colpoint;
+ terrainnormal = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0) * -1;
+ ReflectVector(&tipvelocity, &terrainnormal);
+
+ bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal)));
+ if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness))bounceness = 0;
+ frictionness = abs(normaldotproduct(tipvelocity, terrainnormal));
+ tipvelocity -= bounceness;
+ if (1 - friction * frictionness > 0)tipvelocity *= 1 - friction * frictionness;
+ else tipvelocity = 0;
+ tipvelocity += bounceness * elasticity;
+
+ if (findLengthfast(&bounceness) > 1) {
+ int whichsound;
+ if (type == staff)
+ whichsound = footstepsound3 + abs(Random() % 2);
+ else
+ whichsound = clank1sound + abs(Random() % 4);
+ emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness));
+ }
+ tippoint += (mid - oldmid2) * (20 / (1 + (float)m * 10));
+ }
+ }
+ else {
+ start = position;
+ end = tippoint;
+ whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+ if (whichhit != -1) {
+ hitsomething = 1;
+ closestdistance = -1;
+ closestswordpoint = colpoint; //(position+tippoint)/2;
+ point[0] = DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[0]], 0, objects.yaw[k], 0) + objects.position[k];
+ point[1] = DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[1]], 0, objects.yaw[k], 0) + objects.position[k];
+ point[2] = DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[2]], 0, objects.yaw[k], 0) + objects.position[k];
+ if (DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance, &colpoint )) {
+ if (distance < closestdistance || closestdistance == -1) {
+ closestpoint = colpoint;
+ closestdistance = distance;
+ }
+ }
+ if (DistancePointLine(&closestswordpoint, &point[1], &point[2], &distance, &colpoint )) {
+ if (distance < closestdistance || closestdistance == -1) {
+ closestpoint = colpoint;
+ closestdistance = distance;
+ }
+ }
+ if (DistancePointLine(&closestswordpoint, &point[2], &point[0], &distance, &colpoint )) {
+ if (distance < closestdistance || closestdistance == -1) {
+ closestpoint = colpoint;
+ closestdistance = distance;
+ }
+ }
+ if (closestdistance != -1 && isnormal(closestdistance)) {
+ if (DistancePointLine(&closestpoint, &position, &tippoint, &distance, &colpoint )) {
+ closestswordpoint = colpoint;
+ velocity += (closestpoint - closestswordpoint);
+ tipvelocity += (closestpoint - closestswordpoint);
+ position += (closestpoint - closestswordpoint);
+ tippoint += (closestpoint - closestswordpoint);
+ }
+ }
+ }
+ }
+ }
+ }
+ //Terrain collisions
+ whichhit = terrain.lineTerrain(oldposition, position, &colpoint);
+ if (whichhit != -1 || position.y < terrain.getHeight(position.x, position.z)) {
+ hitsomething = 1;
+ if (whichhit != -1)
+ position = colpoint * terrain.scale;
+ else
+ position.y = terrain.getHeight(position.x, position.z);
+
+ terrainnormal = terrain.getNormal(position.x, position.z);
+ ReflectVector(&velocity, &terrainnormal);
+ position += terrainnormal * .002;
+ bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal)));
+ if (findLengthfast(&velocity) < findLengthfast(&bounceness))bounceness = 0;
+ frictionness = abs(normaldotproduct(velocity, terrainnormal));
+ velocity -= bounceness;
+ if (1 - friction * frictionness > 0)velocity *= 1 - friction * frictionness;
+ else velocity = 0;
+ if (terrain.getOpacity(position.x, position.z) < .2)velocity += bounceness * elasticity * .3;
+ else velocity += bounceness * elasticity;
+
+ if (findLengthfast(&bounceness) > 1) {
+ int whichsound;
+ if (terrain.getOpacity(position.x, position.z) > .2) {
+ if (type == staff)
+ whichsound = footstepsound3 + abs(Random() % 2);
+ else
+ whichsound = clank1sound + abs(Random() % 4);
+ } else {
+ whichsound = footstepsound + abs(Random() % 2);
+ }
+ emit_sound_at(whichsound, position,
+ findLengthfast(&bounceness)
+ * (terrain.getOpacity(position.x, position.z) > .2 ? 128. : 32.));
+
+ if (terrain.getOpacity(position.x, position.z) < .2) {
+ XYZ terrainlight;
+ terrainlight = terrain.getLighting(position.x, position.z);
+ if (environment == snowyenvironment) {
+ if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7);
+ } else if (environment == grassyenvironment) {
+ if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5);
+ } else if (environment == desertenvironment) {
+ if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7);
+ }
+ }
+ }
+ }
+ whichhit = terrain.lineTerrain(oldtippoint, tippoint, &colpoint);
+ if (whichhit != -1 || tippoint.y < terrain.getHeight(tippoint.x, tippoint.z)) {
+ if (whichhit != -1)
+ tippoint = colpoint * terrain.scale;
+ else
+ tippoint.y = terrain.getHeight(tippoint.x, tippoint.z);
+
+ terrainnormal = terrain.getNormal(tippoint.x, tippoint.z);
+ ReflectVector(&tipvelocity, &terrainnormal);
+ tippoint += terrainnormal * .002;
+ bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal)));
+ if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness))bounceness = 0;
+ frictionness = abs(normaldotproduct(tipvelocity, terrainnormal));
+ tipvelocity -= bounceness;
+ if (1 - friction * frictionness > 0)tipvelocity *= 1 - friction * frictionness;
+ else tipvelocity = 0;
+ if (terrain.getOpacity(tippoint.x, tippoint.z) < .2)tipvelocity += bounceness * elasticity * .3;
+ else tipvelocity += bounceness * elasticity;
+
+ if (findLengthfast(&bounceness) > 1) {
+ int whichsound;
+ if (terrain.getOpacity(tippoint.x, tippoint.z) > .2) {
+ if (type == staff)
+ whichsound = footstepsound3 + abs(Random() % 2);
+ else
+ whichsound = clank1sound + abs(Random() % 4);
+ } else {
+ whichsound = footstepsound + abs(Random() % 2);
+ }
+ emit_sound_at(whichsound, tippoint,
+ findLengthfast(&bounceness)
+ * (terrain.getOpacity(tippoint.x, tippoint.z) > .2 ? 128. : 32.));
+
+ if (terrain.getOpacity(tippoint.x, tippoint.z) < .2) {
+ XYZ terrainlight;
+ terrainlight = terrain.getLighting(tippoint.x, tippoint.z);
+ if (environment == snowyenvironment) {
+ if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7);
+ } else if (environment == grassyenvironment) {
+ if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5);
+ } else if (environment == desertenvironment) {
+ if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4)
+ Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7);
+ }
+ }
+ }
+ }
+
+ //Edges
+ mid = position + tippoint;
+ mid /= 2;
+ mid += (position - mid) / 20;
+ oldmid = mid;
+ if (mid.y < terrain.getHeight(mid.x, mid.z)) {
+ hitsomething = 1;
+ mid.y = terrain.getHeight(mid.x, mid.z);
+
+ terrainnormal = terrain.getNormal(mid.x, mid.z);
+ ReflectVector(&velocity, &terrainnormal);
+ //mid+=terrainnormal*.002;
+ bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal)));
+ if (findLengthfast(&velocity) < findLengthfast(&bounceness))bounceness = 0;
+ frictionness = abs(normaldotproduct(velocity, terrainnormal));
+ velocity -= bounceness;
+ if (1 - friction * frictionness > 0)velocity *= 1 - friction * frictionness;
+ else velocity = 0;
+ if (terrain.getOpacity(mid.x, mid.z) < .2)velocity += bounceness * elasticity * .3;
+ else velocity += bounceness * elasticity;
+
+ if (findLengthfast(&bounceness) > 1) {
+ int whichsound;
+ if (terrain.getOpacity(mid.x, mid.z) > .2) {
+ if (type == staff)whichsound = footstepsound3 + abs(Random() % 2);
+ if (type != staff)whichsound = clank1sound + abs(Random() % 4);
+ } else whichsound = footstepsound + abs(Random() % 2);
+ emit_sound_at(whichsound, mid,
+ findLengthfast(&bounceness)
+ * (terrain.getOpacity(position.x, position.z) > .2
+ ? 128.
+ : 32.));
+ }
+ position += (mid - oldmid) * 20;
+ }
+
+ mid = position + tippoint;
+ mid /= 2;
+ mid += (tippoint - mid) / 20;
+ oldmid = mid;
+ if (mid.y < terrain.getHeight(mid.x, mid.z)) {
+ hitsomething = 1;
+ mid.y = terrain.getHeight(mid.x, mid.z);
+
+ terrainnormal = terrain.getNormal(mid.x, mid.z);
+ ReflectVector(&tipvelocity, &terrainnormal);
+ //mid+=terrainnormal*.002;
+ bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal)));
+ if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness))bounceness = 0;
+ frictionness = abs(normaldotproduct(tipvelocity, terrainnormal));
+ tipvelocity -= bounceness;
+ if (1 - friction * frictionness > 0)tipvelocity *= 1 - friction * frictionness;
+ else tipvelocity = 0;
+ if (terrain.getOpacity(mid.x, mid.z) < .2)tipvelocity += bounceness * elasticity * .3;
+ else tipvelocity += bounceness * elasticity;
+
+ if (findLengthfast(&bounceness) > 1) {
+ int whichsound;
+ if (terrain.getOpacity(mid.x, mid.z) > .2) {
+ if (type == staff)whichsound = footstepsound3 + abs(Random() % 2);
+ if (type != staff)whichsound = clank1sound + abs(Random() % 4);
+ } else whichsound = footstepsound + abs(Random() % 2);
+ emit_sound_at(whichsound, mid,
+ findLengthfast(&bounceness)
+ * (terrain.getOpacity(position.x, position.z) > .2
+ ? 128.
+ : 32.));
+ }
+ tippoint += (mid - oldmid) * 20;
+ }
+ //Gravity
+ velocity.y += gravity * multiplier;
+ tipvelocity.y += gravity * multiplier;
+
+ //Rotation
+ XYZ temppoint1, temppoint2, tempforward;
+ float distance;
+
+ temppoint1 = position;
+ temppoint2 = tippoint;
+ distance = findDistance(&temppoint1, &temppoint2);
+ rotation2 = asin((temppoint1.y - temppoint2.y) / distance);
+ rotation2 *= 360 / 6.28;
+ temppoint1.y = 0;
+ temppoint2.y = 0;
+ rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2));
+ rotation1 *= 360 / 6.28;
+ rotation3 = 0;
+ smallrotation = 90;
+ smallrotation2 = 0;
+ bigtilt = 0;
+ bigtilt2 = 0;
+ bigrotation = 0;
+ if (temppoint1.x > temppoint2.x)rotation1 = 360 - rotation1;
+
+ //Stop moving
+ if (findLengthfast(&velocity) < .3 && findLengthfast(&tipvelocity) < .3 && hitsomething) {
+ freetime += multiplier;
+ }
+
+ if (freetime > .4) {
+ velocity = 0;
+ tipvelocity = 0;
+ }
+ firstfree = 0;
+ }
+ }
+ multiplier = tempmult;
+ if (blooddrip && bloody) {
+ blooddripdelay -= blooddrip * multiplier / 2;
+ blooddrip -= multiplier;
+ if (blooddrip < 0) blooddrip = 0;
+ if (blooddrip > 5) blooddrip = 5;
+ if (blooddripdelay < 0 && bloodtoggle) {
+ blooddripdelay = 1;
+ XYZ bloodvel;
+ XYZ bloodloc;
+ bloodloc = position + (tippoint - position) * .7;
+ bloodloc.y -= .05;
+ if (bloodtoggle) {
+ bloodvel = 0;
+ Sprite::MakeSprite(bloodsprite, bloodloc, bloodvel, 1, 1, 1, .03, 1);
+ }
+ }
+ }
+ if (onfire) {
+ flamedelay -= multiplier;
+ if (onfire && flamedelay <= 0) {
+ flamedelay = .020;
+ flamedelay -= multiplier;
+ normalrot = 0;
+ if (owner != -1) {
+ normalrot = player[owner].velocity;
+ }
+ normalrot.y += 1;
+ if (owner != -1) {
+ if (player[owner].onterrain) {
+ normalrot.y = 1;
+ }
+ }
+ Sprite::MakeSprite(weaponflamesprite, position + tippoint * (((float)abs(Random() % 100)) / 600 + .05), normalrot, 1, 1, 1, (.6 + (float)abs(Random() % 100) / 200 - .25) * 1 / 3, 1);
+ Sprite::setLastSpriteSpeed(4);
+ Sprite::setLastSpriteAlivetime(.3);
+ }
+ }
+
+ if (!onfire && owner == -1 && type != staff) {
+ flamedelay -= multiplier;
+ if (flamedelay <= 0) {
+ flamedelay = .020;
+ flamedelay -= multiplier;
+ normalrot = 0;
+ if (Random() % 50 == 0 && distsq(&position, &viewer) > 80) {
+ XYZ shinepoint;
+ shinepoint = position + (tippoint - position) * (((float)abs(Random() % 100)) / 100);
+ Sprite::MakeSprite(weaponshinesprite, shinepoint, normalrot, 1, 1, 1, (.1 + (float)abs(Random() % 100) / 200 - .25) * 1 / 3 * fast_sqrt(findDistance(&shinepoint, &viewer)), 1);
+ Sprite::setLastSpriteSpeed(4);
+ Sprite::setLastSpriteAlivetime(.3);
+ }
+ }
+ }
}
-void Weapons::DoStuff() {
- //Move
- int i = 0;
- for(std::vector<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
- weapon->DoStuff(i++);
- }
+void Weapons::DoStuff()
+{
+ //Move
+ int i = 0;
+ for (std::vector<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
+ weapon->DoStuff(i++);
+ }
}
-void Weapon::Draw() {
- static XYZ terrainlight;
- static GLfloat M[16];
-
- if((frustum.SphereInFrustum(position.x,position.y,position.z,1)&&
- distsq(&viewer,&position)<viewdistance*viewdistance))
- {
- bool draw=false;
- if(owner==-1)
- {
- draw=true;
- if(velocity.x && !physics)
- drawhowmany=10;
- else
- drawhowmany=1;
- } else {
- if(player[owner].occluded<25)
- if((frustum.SphereInFrustum(player[owner].coords.x,player[owner].coords.y+player[owner].scale*3,player[owner].coords.z,player[owner].scale*8)&&distsq(&viewer,&player[owner].coords)<viewdistance*viewdistance)||player[owner].skeleton.free==3)
- draw=true;
- if (
- (player[owner].animTarget==knifeslashstartanim||
- player[owner].animTarget==swordsneakattackanim||
- (player[owner].animCurrent==staffhitanim && player[owner].frameCurrent>1)||
- (player[owner].animCurrent==staffhitreversedanim && player[owner].frameCurrent>1)||
- (player[owner].animCurrent==staffspinhitanim && player[owner].frameCurrent>1)||
- (player[owner].animCurrent==staffspinhitreversedanim && player[owner].frameCurrent>1)||
- (player[owner].animCurrent==staffgroundsmashanim && player[owner].frameCurrent>1)||
- (player[owner].animTarget==swordslashanim && player[owner].frameTarget<7)||
- player[owner].animTarget==crouchstabanim||
- player[owner].animTarget==swordslashreversalanim||
- player[owner].animTarget==swordslashreversedanim||
- player[owner].animTarget==knifefollowanim||
- player[owner].animTarget==swordgroundstabanim||
- player[owner].animTarget==knifethrowanim)&&
- player[owner].animTarget==lastdrawnanim&&
- !player[owner].skeleton.free
- )
- {
- drawhowmany=10;
- } else {
- drawhowmany=1;
- }
- if(player[owner].animTarget==swordgroundstabanim)
- {
- lastdrawnrotation1=rotation1;
- lastdrawnrotation2=rotation2;
- lastdrawnrotation3=rotation3;
- lastdrawnbigrotation=bigrotation;
- lastdrawnbigtilt=bigtilt;
- lastdrawnbigtilt2=bigtilt2;
- lastdrawnsmallrotation=smallrotation;
- lastdrawnsmallrotation2=smallrotation2;
- }
- }
- if(draw)
- {
- terrainlight=terrain.getLighting(position.x,position.z);
- if(drawhowmany>0)
- {
- glAlphaFunc(GL_GREATER, 0.01);
- }
- for(int j=drawhowmany;j>0;j--)
- {
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,j/drawhowmany);
- if(owner==-1)
- glTranslatef(position.x*(((float)(j))/drawhowmany)+lastdrawnposition.x*(1-((float)(j))/drawhowmany),position.y*(((float)(j))/drawhowmany)+lastdrawnposition.y*(1-((float)(j))/drawhowmany),position.z*(((float)(j))/drawhowmany)+lastdrawnposition.z*(1-((float)(j))/drawhowmany));
- else
- glTranslatef(position.x*(((float)(j))/drawhowmany)+lastdrawnposition.x*(1-((float)(j))/drawhowmany),position.y*(((float)(j))/drawhowmany)-.02+lastdrawnposition.y*(1-((float)(j))/drawhowmany),position.z*(((float)(j))/drawhowmany)+lastdrawnposition.z*(1-((float)(j))/drawhowmany));
- glRotatef(bigrotation*(((float)(j))/drawhowmany)+lastdrawnbigrotation*(1-((float)(j))/drawhowmany),0,1,0);
- glRotatef(bigtilt2*(((float)(j))/drawhowmany)+lastdrawnbigtilt2*(1-((float)(j))/drawhowmany),1,0,0);
- glRotatef(bigtilt*(((float)(j))/drawhowmany)+lastdrawnbigtilt*(1-((float)(j))/drawhowmany),0,0,1);
- glRotatef(-rotation1*(((float)(j))/drawhowmany)-lastdrawnrotation1*(1-((float)(j))/drawhowmany)+90,0,1,0);
- glRotatef(-rotation2*(((float)(j))/drawhowmany)-lastdrawnrotation2*(1-((float)(j))/drawhowmany)+90,0,0,1);
- glRotatef(-rotation3*(((float)(j))/drawhowmany)-lastdrawnrotation3*(1-((float)(j))/drawhowmany),0,1,0);
- glRotatef(smallrotation*(((float)(j))/drawhowmany)+lastdrawnsmallrotation*(1-((float)(j))/drawhowmany),1,0,0);
- glRotatef(smallrotation2*(((float)(j))/drawhowmany)+lastdrawnsmallrotation2*(1-((float)(j))/drawhowmany),0,1,0);
-
- if(owner!=-1)
- {
- if(player[owner].animTarget==staffhitanim||player[owner].animCurrent==staffhitanim||player[owner].animTarget==staffhitreversedanim||player[owner].animCurrent==staffhitreversedanim)
- {
- glTranslatef(0,0,-.3);
- }
- if(player[owner].animTarget==staffgroundsmashanim||player[owner].animCurrent==staffgroundsmashanim||player[owner].animTarget==staffspinhitreversedanim||player[owner].animCurrent==staffspinhitreversedanim||player[owner].animTarget==staffspinhitanim||player[owner].animCurrent==staffspinhitanim)
- {
- glTranslatef(0,0,-.1);
- }
- }
-
- glEnable(GL_LIGHTING);
- switch(type) {
- case knife:
- if(!bloody||!bloodtoggle)
- throwingknifemodel.drawdifftex(knifetextureptr);
- if(bloodtoggle)
- {
- if(bloody==1)
- throwingknifemodel.drawdifftex(lightbloodknifetextureptr);
- if(bloody==2)
- throwingknifemodel.drawdifftex(bloodknifetextureptr);
- }
- break;
- case sword:
- if(!bloody||!bloodtoggle)
- swordmodel.drawdifftex(swordtextureptr);
- if(bloodtoggle)
- {
- if(bloody==1)
- swordmodel.drawdifftex(lightbloodswordtextureptr);
- if(bloody==2)
- swordmodel.drawdifftex(bloodswordtextureptr);
- }
- break;
- case staff:
- staffmodel.drawdifftex(stafftextureptr);
- break;
- }
-
- glPopMatrix();
- }
-
- lastdrawnposition=position;
- lastdrawntippoint=tippoint;
- lastdrawnrotation1=rotation1;
- lastdrawnrotation2=rotation2;
- lastdrawnrotation3=rotation3;
- lastdrawnbigrotation=bigrotation;
- lastdrawnbigtilt=bigtilt;
- lastdrawnbigtilt2=bigtilt2;
- lastdrawnsmallrotation=smallrotation;
- lastdrawnsmallrotation2=smallrotation2;
- if(owner!=-1)lastdrawnanim=player[owner].animCurrent;
- }
- if(owner!=-1)
- {
- glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
- glPushMatrix();
- glLoadIdentity();
- glTranslatef(position.x,position.y-.02,position.z);
- glRotatef(bigrotation,0,1,0);
- glRotatef(bigtilt2,1,0,0);
- glRotatef(bigtilt,0,0,1);
- glRotatef(-rotation1+90,0,1,0);
- glRotatef(-rotation2+90,0,0,1);
- glRotatef(-rotation3,0,1,0);
- glRotatef(smallrotation,1,0,0);
- glRotatef(smallrotation2,0,1,0);
- glTranslatef(0,0,length);
- glGetFloatv(GL_MODELVIEW_MATRIX,M);
- tippoint.x=M[12];
- tippoint.y=M[13];
- tippoint.z=M[14];
- glPopMatrix();
- }
- }
+void Weapon::Draw()
+{
+ static XYZ terrainlight;
+ static GLfloat M[16];
+
+ if ((frustum.SphereInFrustum(position.x, position.y, position.z, 1) &&
+ distsq(&viewer, &position) < viewdistance * viewdistance)) {
+ bool draw = false;
+ if (owner == -1) {
+ draw = true;
+ if (velocity.x && !physics)
+ drawhowmany = 10;
+ else
+ drawhowmany = 1;
+ } else {
+ if (player[owner].occluded < 25)
+ if ((frustum.SphereInFrustum(player[owner].coords.x, player[owner].coords.y + player[owner].scale * 3, player[owner].coords.z, player[owner].scale * 8) && distsq(&viewer, &player[owner].coords) < viewdistance * viewdistance) || player[owner].skeleton.free == 3)
+ draw = true;
+ if (
+ (player[owner].animTarget == knifeslashstartanim ||
+ player[owner].animTarget == swordsneakattackanim ||
+ (player[owner].animCurrent == staffhitanim && player[owner].frameCurrent > 1) ||
+ (player[owner].animCurrent == staffhitreversedanim && player[owner].frameCurrent > 1) ||
+ (player[owner].animCurrent == staffspinhitanim && player[owner].frameCurrent > 1) ||
+ (player[owner].animCurrent == staffspinhitreversedanim && player[owner].frameCurrent > 1) ||
+ (player[owner].animCurrent == staffgroundsmashanim && player[owner].frameCurrent > 1) ||
+ (player[owner].animTarget == swordslashanim && player[owner].frameTarget < 7) ||
+ player[owner].animTarget == crouchstabanim ||
+ player[owner].animTarget == swordslashreversalanim ||
+ player[owner].animTarget == swordslashreversedanim ||
+ player[owner].animTarget == knifefollowanim ||
+ player[owner].animTarget == swordgroundstabanim ||
+ player[owner].animTarget == knifethrowanim) &&
+ player[owner].animTarget == lastdrawnanim &&
+ !player[owner].skeleton.free
+ ) {
+ drawhowmany = 10;
+ } else {
+ drawhowmany = 1;
+ }
+ if (player[owner].animTarget == swordgroundstabanim) {
+ lastdrawnrotation1 = rotation1;
+ lastdrawnrotation2 = rotation2;
+ lastdrawnrotation3 = rotation3;
+ lastdrawnbigrotation = bigrotation;
+ lastdrawnbigtilt = bigtilt;
+ lastdrawnbigtilt2 = bigtilt2;
+ lastdrawnsmallrotation = smallrotation;
+ lastdrawnsmallrotation2 = smallrotation2;
+ }
+ }
+ if (draw) {
+ terrainlight = terrain.getLighting(position.x, position.z);
+ if (drawhowmany > 0) {
+ glAlphaFunc(GL_GREATER, 0.01);
+ }
+ for (int j = drawhowmany; j > 0; j--) {
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, j / drawhowmany);
+ if (owner == -1)
+ glTranslatef(position.x * (((float)(j)) / drawhowmany) + lastdrawnposition.x * (1 - ((float)(j)) / drawhowmany), position.y * (((float)(j)) / drawhowmany) + lastdrawnposition.y * (1 - ((float)(j)) / drawhowmany), position.z * (((float)(j)) / drawhowmany) + lastdrawnposition.z * (1 - ((float)(j)) / drawhowmany));
+ else
+ glTranslatef(position.x * (((float)(j)) / drawhowmany) + lastdrawnposition.x * (1 - ((float)(j)) / drawhowmany), position.y * (((float)(j)) / drawhowmany) - .02 + lastdrawnposition.y * (1 - ((float)(j)) / drawhowmany), position.z * (((float)(j)) / drawhowmany) + lastdrawnposition.z * (1 - ((float)(j)) / drawhowmany));
+ glRotatef(bigrotation * (((float)(j)) / drawhowmany) + lastdrawnbigrotation * (1 - ((float)(j)) / drawhowmany), 0, 1, 0);
+ glRotatef(bigtilt2 * (((float)(j)) / drawhowmany) + lastdrawnbigtilt2 * (1 - ((float)(j)) / drawhowmany), 1, 0, 0);
+ glRotatef(bigtilt * (((float)(j)) / drawhowmany) + lastdrawnbigtilt * (1 - ((float)(j)) / drawhowmany), 0, 0, 1);
+ glRotatef(-rotation1 * (((float)(j)) / drawhowmany) - lastdrawnrotation1 * (1 - ((float)(j)) / drawhowmany) + 90, 0, 1, 0);
+ glRotatef(-rotation2 * (((float)(j)) / drawhowmany) - lastdrawnrotation2 * (1 - ((float)(j)) / drawhowmany) + 90, 0, 0, 1);
+ glRotatef(-rotation3 * (((float)(j)) / drawhowmany) - lastdrawnrotation3 * (1 - ((float)(j)) / drawhowmany), 0, 1, 0);
+ glRotatef(smallrotation * (((float)(j)) / drawhowmany) + lastdrawnsmallrotation * (1 - ((float)(j)) / drawhowmany), 1, 0, 0);
+ glRotatef(smallrotation2 * (((float)(j)) / drawhowmany) + lastdrawnsmallrotation2 * (1 - ((float)(j)) / drawhowmany), 0, 1, 0);
+
+ if (owner != -1) {
+ if (player[owner].animTarget == staffhitanim || player[owner].animCurrent == staffhitanim || player[owner].animTarget == staffhitreversedanim || player[owner].animCurrent == staffhitreversedanim) {
+ glTranslatef(0, 0, -.3);
+ }
+ if (player[owner].animTarget == staffgroundsmashanim || player[owner].animCurrent == staffgroundsmashanim || player[owner].animTarget == staffspinhitreversedanim || player[owner].animCurrent == staffspinhitreversedanim || player[owner].animTarget == staffspinhitanim || player[owner].animCurrent == staffspinhitanim) {
+ glTranslatef(0, 0, -.1);
+ }
+ }
+
+ glEnable(GL_LIGHTING);
+ switch (type) {
+ case knife:
+ if (!bloody || !bloodtoggle)
+ throwingknifemodel.drawdifftex(knifetextureptr);
+ if (bloodtoggle) {
+ if (bloody == 1)
+ throwingknifemodel.drawdifftex(lightbloodknifetextureptr);
+ if (bloody == 2)
+ throwingknifemodel.drawdifftex(bloodknifetextureptr);
+ }
+ break;
+ case sword:
+ if (!bloody || !bloodtoggle)
+ swordmodel.drawdifftex(swordtextureptr);
+ if (bloodtoggle) {
+ if (bloody == 1)
+ swordmodel.drawdifftex(lightbloodswordtextureptr);
+ if (bloody == 2)
+ swordmodel.drawdifftex(bloodswordtextureptr);
+ }
+ break;
+ case staff:
+ staffmodel.drawdifftex(stafftextureptr);
+ break;
+ }
+
+ glPopMatrix();
+ }
+
+ lastdrawnposition = position;
+ lastdrawntippoint = tippoint;
+ lastdrawnrotation1 = rotation1;
+ lastdrawnrotation2 = rotation2;
+ lastdrawnrotation3 = rotation3;
+ lastdrawnbigrotation = bigrotation;
+ lastdrawnbigtilt = bigtilt;
+ lastdrawnbigtilt2 = bigtilt2;
+ lastdrawnsmallrotation = smallrotation;
+ lastdrawnsmallrotation2 = smallrotation2;
+ if (owner != -1)lastdrawnanim = player[owner].animCurrent;
+ }
+ if (owner != -1) {
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glPushMatrix();
+ glLoadIdentity();
+ glTranslatef(position.x, position.y - .02, position.z);
+ glRotatef(bigrotation, 0, 1, 0);
+ glRotatef(bigtilt2, 1, 0, 0);
+ glRotatef(bigtilt, 0, 0, 1);
+ glRotatef(-rotation1 + 90, 0, 1, 0);
+ glRotatef(-rotation2 + 90, 0, 0, 1);
+ glRotatef(-rotation3, 0, 1, 0);
+ glRotatef(smallrotation, 1, 0, 0);
+ glRotatef(smallrotation2, 0, 1, 0);
+ glTranslatef(0, 0, length);
+ glGetFloatv(GL_MODELVIEW_MATRIX, M);
+ tippoint.x = M[12];
+ tippoint.y = M[13];
+ tippoint.z = M[14];
+ glPopMatrix();
+ }
+ }
}
int Weapons::Draw()
{
- glAlphaFunc(GL_GREATER, 0.9);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_FRONT);
- glDepthMask(1);
-
- for(std::vector<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
- weapon->Draw();
- }
- return 0;
+ glAlphaFunc(GL_GREATER, 0.9);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ glDepthMask(1);
+
+ for (std::vector<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
+ weapon->Draw();
+ }
+ return 0;
}
Weapons::Weapons()
Weapons::~Weapons()
{
- Weapon::stafftextureptr.destroy();
- Weapon::knifetextureptr.destroy();
- Weapon::lightbloodknifetextureptr.destroy();
- Weapon::bloodknifetextureptr.destroy();
- Weapon::swordtextureptr.destroy();
- Weapon::lightbloodswordtextureptr.destroy();
- Weapon::bloodswordtextureptr.destroy();
+ Weapon::stafftextureptr.destroy();
+ Weapon::knifetextureptr.destroy();
+ Weapon::lightbloodknifetextureptr.destroy();
+ Weapon::bloodknifetextureptr.destroy();
+ Weapon::swordtextureptr.destroy();
+ Weapon::lightbloodswordtextureptr.destroy();
+ Weapon::bloodswordtextureptr.destroy();
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#define sword 2
#define staff 3
-class Weapon {
- public:
- Weapon(int type, int owner);
-
- static Model throwingknifemodel;
- static Texture knifetextureptr;
- static Texture lightbloodknifetextureptr;
- static Texture bloodknifetextureptr;
-
- static Model swordmodel;
- static Texture swordtextureptr;
- static Texture lightbloodswordtextureptr;
- static Texture bloodswordtextureptr;
-
- static Model staffmodel;
- static Texture stafftextureptr;
-
- void Draw();
- void DoStuff(int);
-
- int getType() { return type; }
- void setType(int);
-
- int owner;
- XYZ position;
- XYZ tippoint;
- XYZ velocity;
- XYZ tipvelocity;
- bool missed;
- bool hitsomething;
- float freetime;
- bool firstfree;
- bool physics;
-
- float damage;
- int bloody;
- float blooddrip;
- float blooddripdelay;
-
- float rotation1;
- float rotation2;
- float rotation3;
- float bigrotation;
- float bigtilt;
- float bigtilt2;
- float smallrotation;
- float smallrotation2;
- private:
- int type;
-
- XYZ oldtippoint;
- float lastmult;
- XYZ oldposition;
- int oldowner;
- bool onfire;
- float flamedelay;
- float mass;
- float tipmass;
- float length;
- float drawhowmany;
-
- XYZ lastdrawnposition;
- XYZ lastdrawntippoint;
- float lastdrawnrotation1;
- float lastdrawnrotation2;
- float lastdrawnrotation3;
- float lastdrawnbigrotation;
- float lastdrawnbigtilt;
- float lastdrawnbigtilt2;
- float lastdrawnsmallrotation;
- float lastdrawnsmallrotation2;
- int lastdrawnanim;
+class Weapon
+{
+public:
+ Weapon(int type, int owner);
+
+ static Model throwingknifemodel;
+ static Texture knifetextureptr;
+ static Texture lightbloodknifetextureptr;
+ static Texture bloodknifetextureptr;
+
+ static Model swordmodel;
+ static Texture swordtextureptr;
+ static Texture lightbloodswordtextureptr;
+ static Texture bloodswordtextureptr;
+
+ static Model staffmodel;
+ static Texture stafftextureptr;
+
+ void Draw();
+ void DoStuff(int);
+
+ int getType() {
+ return type;
+ }
+ void setType(int);
+
+ int owner;
+ XYZ position;
+ XYZ tippoint;
+ XYZ velocity;
+ XYZ tipvelocity;
+ bool missed;
+ bool hitsomething;
+ float freetime;
+ bool firstfree;
+ bool physics;
+
+ float damage;
+ int bloody;
+ float blooddrip;
+ float blooddripdelay;
+
+ float rotation1;
+ float rotation2;
+ float rotation3;
+ float bigrotation;
+ float bigtilt;
+ float bigtilt2;
+ float smallrotation;
+ float smallrotation2;
+private:
+ int type;
+
+ XYZ oldtippoint;
+ float lastmult;
+ XYZ oldposition;
+ int oldowner;
+ bool onfire;
+ float flamedelay;
+ float mass;
+ float tipmass;
+ float length;
+ float drawhowmany;
+
+ XYZ lastdrawnposition;
+ XYZ lastdrawntippoint;
+ float lastdrawnrotation1;
+ float lastdrawnrotation2;
+ float lastdrawnrotation3;
+ float lastdrawnbigrotation;
+ float lastdrawnbigtilt;
+ float lastdrawnbigtilt2;
+ float lastdrawnsmallrotation;
+ float lastdrawnsmallrotation2;
+ int lastdrawnanim;
};
class Weapons : public std::vector<Weapon>
{
public:
- Weapons();
- ~Weapons();
-
- int Draw();
- void DoStuff();
+ Weapons();
+ ~Weapons();
+
+ int Draw();
+ void DoStuff();
};
extern Weapons weapons;
class AppTime
{
public:
- AppTime()
- {
- counterRate = 1;
- baseCounter = 0;
- QueryPerformanceFrequency( (LARGE_INTEGER*)&counterRate);
- QueryPerformanceCounter( (LARGE_INTEGER*)&baseCounter);
- }
- __int64 counterRate; // LARGE_INTEGER type has no math functions so use int64
- __int64 baseCounter;
+ AppTime() {
+ counterRate = 1;
+ baseCounter = 0;
+ QueryPerformanceFrequency( (LARGE_INTEGER*)&counterRate);
+ QueryPerformanceCounter( (LARGE_INTEGER*)&baseCounter);
+ }
+ __int64 counterRate; // LARGE_INTEGER type has no math functions so use int64
+ __int64 baseCounter;
};
static AppTime g_appTime;
void CopyCStringToPascal( const char* src, unsigned char dst[256])
{
- int len = strlen( src);
- dst[0] = len;
- memcpy( dst + 1, src, len);
+ int len = strlen( src);
+ dst[0] = len;
+ memcpy( dst + 1, src, len);
}
void CopyPascalStringToC( const unsigned char* src, char* dst)
{
- int len = src[0];
- memcpy( dst, src + 1, len);
- dst[len] = 0;
+ int len = src[0];
+ memcpy( dst, src + 1, len);
+ dst[len] = 0;
}
AbsoluteTime UpTime()
{
- __int64 counter;
- QueryPerformanceCounter( (LARGE_INTEGER*)&counter);
+ __int64 counter;
+ QueryPerformanceCounter( (LARGE_INTEGER*)&counter);
- counter -= g_appTime.baseCounter;
+ counter -= g_appTime.baseCounter;
- AbsoluteTime time;
- time.lo = (unsigned long)counter;
- time.hi = (unsigned long)(counter >> 32);
- return time;
+ AbsoluteTime time;
+ time.lo = (unsigned long)counter;
+ time.hi = (unsigned long)(counter >> 32);
+ return time;
}
Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b)
{
- __int64 value = a.hi;
- value <<= 32;
- value |= a.lo;
- __int64 value2 = b.hi;
- value2 <<= 32;
- value2 |= b.lo;
- value -= value2;
-
- if (value <= 0)
- return durationImmediate;
-
- __int64 frac = value % g_appTime.counterRate;
- value /= g_appTime.counterRate;
-
- Duration time;
-
- if (value == 0)
- {
- frac *= -1000000;
- frac /= g_appTime.counterRate;
- time = (Duration)frac;
- }
- else
- {
- frac *= 1000;
- frac /= g_appTime.counterRate;
- value *= 1000;
- value += frac;
- time = (Duration)value;
- }
-
- return time;
+ __int64 value = a.hi;
+ value <<= 32;
+ value |= a.lo;
+ __int64 value2 = b.hi;
+ value2 <<= 32;
+ value2 |= b.lo;
+ value -= value2;
+
+ if (value <= 0)
+ return durationImmediate;
+
+ __int64 frac = value % g_appTime.counterRate;
+ value /= g_appTime.counterRate;
+
+ Duration time;
+
+ if (value == 0) {
+ frac *= -1000000;
+ frac /= g_appTime.counterRate;
+ time = (Duration)frac;
+ } else {
+ frac *= 1000;
+ frac /= g_appTime.counterRate;
+ value *= 1000;
+ value += frac;
+ time = (Duration)value;
+ }
+
+ return time;
}
static char g_filename[ 256];
char* ConvertFileName( const char* orgfilename)
{
- // translate filename into proper path name
- if (orgfilename[ 0] == ':')
- orgfilename++;
- strcpy( g_filename, orgfilename);
-
- for (int n = 0; g_filename[ n]; n++)
- {
- if (g_filename[ n] == ':')
- g_filename[ n] = '/';
- }
-
- return g_filename;
+ // translate filename into proper path name
+ if (orgfilename[ 0] == ':')
+ orgfilename++;
+ strcpy( g_filename, orgfilename);
+
+ for (int n = 0; g_filename[ n]; n++) {
+ if (g_filename[ n] == ':')
+ g_filename[ n] = '/';
+ }
+
+ return g_filename;
}
char* ConvertFileName( const char* orgfilename, const char* junk)
{
- return ConvertFileName(orgfilename);
+ return ConvertFileName(orgfilename);
}
typedef bool Boolean;
-struct Point
-{
- short v;
- short h;
+struct Point {
+ short v;
+ short h;
};
typedef signed char SInt8;
void CopyPascalStringToC( const unsigned char* src, char* dst);
-typedef struct AbsoluteTime
-{
+typedef struct AbsoluteTime {
unsigned long hi;
unsigned long lo;
} AbsoluteTime;
typedef long Duration;
-enum
-{
+enum {
durationMicrosecond = -1,
durationMillisecond = 1,
durationSecond = 1000,
inline float abs(float f)
{
- if (f < 0)
- return -f;
- return f;
+ if (f < 0)
+ return -f;
+ return f;
}
inline double abs(double f)
{
- if (f < 0)
- return -f;
- return f;
+ if (f < 0)
+ return -f;
+ return f;
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
*/
-AL_FUNC(AL,void,alGenSources,(ALsizei n, ALuint* sources),(n,sources),)
-AL_FUNC(AL,void,alDeleteSources,(ALsizei n, ALuint* sources),(n,sources),)
-AL_FUNC(AL,void,alSourcei,(ALuint sid, ALenum param, ALint value),(sid,param,value),)
-AL_FUNC(AL,void,alSourcef,(ALuint sid, ALenum param, ALfloat value),(sid,param,value),)
-AL_FUNC(AL,void,alSource3f,(ALuint sid, ALenum param, ALfloat f1, ALfloat f2, ALfloat f3),(sid,param,f1,f2,f3),)
-AL_FUNC(AL,void,alGetSourceiv,(ALuint sid, ALenum pname, ALint* values),(sid,pname,values),)
-AL_FUNC(AL,void,alSourcePlay,(ALuint sid),(sid),)
-AL_FUNC(AL,void,alSourcePause,(ALuint sid),(sid),)
-AL_FUNC(AL,void,alSourceStop,(ALuint sid),(sid),)
-AL_FUNC(AL,void,alGenBuffers,(ALsizei n, ALuint* buffers),(n,buffers),)
-AL_FUNC(AL,void,alDeleteBuffers,(ALsizei n, ALuint* buffers),(n,buffers),)
-AL_FUNC(AL,void,alBufferData,(ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq),(buffer,format,data,size,freq),)
-AL_FUNC(AL,void,alListenerfv,(ALenum pname, ALfloat* param),(pname,param),)
-AL_FUNC(AL,void,alListener3f,(ALenum pname, ALfloat f1, ALfloat f2, ALfloat f3),(pname,f1,f2,f3),)
-AL_FUNC(AL,void,alListenerf,(ALenum pname, ALfloat param),(pname,param),)
-AL_FUNC(AL,ALenum,alGetError,(ALvoid),(),return)
-AL_FUNC(AL,const ALubyte*,alGetString,(ALenum param),(param),return)
-AL_FUNC(AL,ALboolean,alIsExtensionPresent,(const ALubyte* fname),(fname),return)
-AL_FUNC(AL,ALenum,alGetEnumValue,(const ALubyte* ename),(ename),return)
-AL_FUNC(ALC,ALCcontext *,alcCreateContext,(ALCdevice *dev, ALint* attrlist),(dev,attrlist),return)
-AL_FUNC(ALC,ALCenum,alcMakeContextCurrent,(ALCcontext *alcHandle),(alcHandle),return)
-AL_FUNC(ALC,ALCcontext *,alcProcessContext,(ALCcontext *alcHandle),(alcHandle),return)
-AL_FUNC(ALC,void,alcSuspendContext,(ALCcontext *alcHandle),(alcHandle),)
-AL_FUNC(ALC,ALCenum,alcDestroyContext,(ALCcontext *alcHandle),(alcHandle),return)
-AL_FUNC(ALC,ALCenum,alcGetError,(ALCdevice *dev),(dev),return)
-AL_FUNC(ALC,ALCcontext *,alcGetCurrentContext,(ALvoid),(),return)
-AL_FUNC(ALC,ALCdevice *,alcOpenDevice,(const ALubyte *tokstr),(tokstr),return)
-AL_FUNC(ALC,void,alcCloseDevice,(ALCdevice *dev),(dev),)
-AL_FUNC(ALC,ALCdevice*,alcGetContextsDevice,(ALCcontext *context),(context),return)
+AL_FUNC(AL, void, alGenSources, (ALsizei n, ALuint* sources), (n, sources),)
+AL_FUNC(AL, void, alDeleteSources, (ALsizei n, ALuint* sources), (n, sources),)
+AL_FUNC(AL, void, alSourcei, (ALuint sid, ALenum param, ALint value), (sid, param, value),)
+AL_FUNC(AL, void, alSourcef, (ALuint sid, ALenum param, ALfloat value), (sid, param, value),)
+AL_FUNC(AL, void, alSource3f, (ALuint sid, ALenum param, ALfloat f1, ALfloat f2, ALfloat f3), (sid, param, f1, f2, f3),)
+AL_FUNC(AL, void, alGetSourceiv, (ALuint sid, ALenum pname, ALint* values), (sid, pname, values),)
+AL_FUNC(AL, void, alSourcePlay, (ALuint sid), (sid),)
+AL_FUNC(AL, void, alSourcePause, (ALuint sid), (sid),)
+AL_FUNC(AL, void, alSourceStop, (ALuint sid), (sid),)
+AL_FUNC(AL, void, alGenBuffers, (ALsizei n, ALuint* buffers), (n, buffers),)
+AL_FUNC(AL, void, alDeleteBuffers, (ALsizei n, ALuint* buffers), (n, buffers),)
+AL_FUNC(AL, void, alBufferData, (ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq), (buffer, format, data, size, freq),)
+AL_FUNC(AL, void, alListenerfv, (ALenum pname, ALfloat* param), (pname, param),)
+AL_FUNC(AL, void, alListener3f, (ALenum pname, ALfloat f1, ALfloat f2, ALfloat f3), (pname, f1, f2, f3),)
+AL_FUNC(AL, void, alListenerf, (ALenum pname, ALfloat param), (pname, param),)
+AL_FUNC(AL, ALenum, alGetError, (ALvoid), (), return)
+AL_FUNC(AL, const ALubyte*, alGetString, (ALenum param), (param), return)
+AL_FUNC(AL, ALboolean, alIsExtensionPresent, (const ALubyte* fname), (fname), return)
+AL_FUNC(AL, ALenum, alGetEnumValue, (const ALubyte* ename), (ename), return)
+AL_FUNC(ALC, ALCcontext *, alcCreateContext, (ALCdevice *dev, ALint* attrlist), (dev, attrlist), return)
+AL_FUNC(ALC, ALCenum, alcMakeContextCurrent, (ALCcontext *alcHandle), (alcHandle), return)
+AL_FUNC(ALC, ALCcontext *, alcProcessContext, (ALCcontext *alcHandle), (alcHandle), return)
+AL_FUNC(ALC, void, alcSuspendContext, (ALCcontext *alcHandle), (alcHandle),)
+AL_FUNC(ALC, ALCenum, alcDestroyContext, (ALCcontext *alcHandle), (alcHandle), return)
+AL_FUNC(ALC, ALCenum, alcGetError, (ALCdevice *dev), (dev), return)
+AL_FUNC(ALC, ALCcontext *, alcGetCurrentContext, (ALvoid), (), return)
+AL_FUNC(ALC, ALCdevice *, alcOpenDevice, (const ALubyte *tokstr), (tokstr), return)
+AL_FUNC(ALC, void, alcCloseDevice, (ALCdevice *dev), (dev),)
+AL_FUNC(ALC, ALCdevice*, alcGetContextsDevice, (ALCcontext *context), (context), return)
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
extern "C" {
#endif
- /*
- Notes on format of format strings:
- * whitespace is ignored
- * each "group" consists of an optional count (defaults to 1),
- an optional byte-order marker (defaults to H, "host-native"),
- and a data-type specifier.
- * when unpacking, each variable argument is a pointer to the
- appropriate number of objects of the appropriate type.
- * when packing, each variable argument is an object of the
- appropriate type if the count is omitted, or a pointer to the
- appropriate number of objects of the appropriate type if the
- count is specified.
- * the buffer supplied to pack/unpack must be of sufficient length
- to hold all the data, or the behavior is unspecified.
- * the file provided to the "f" versions of the functions must be
- open in the appropriate mode, or the behavior is unspecified.
- * the file supplied to funpackf must be of sufficient length to
- hold all the data, or the behavior is unspecified.
- * the behavior of all functions is unspecified if the format string
- is incorrectly-formed.
-
- Data-type specifiers:
- x skipped byte; no corresponding argument
- b byte
- s two-byte two's-complement integer
- i four-byte two's-complement integer
- l eight-byte two's-complement integer
- f four-byte IEEE754 float
- d eight-byte IEEE754 double
-
- Byte-order specifiers:
- L little-endian
- B big-endian
- H host's native byte order
- N network byte order
- */
+ /*
+ Notes on format of format strings:
+ * whitespace is ignored
+ * each "group" consists of an optional count (defaults to 1),
+ an optional byte-order marker (defaults to H, "host-native"),
+ and a data-type specifier.
+ * when unpacking, each variable argument is a pointer to the
+ appropriate number of objects of the appropriate type.
+ * when packing, each variable argument is an object of the
+ appropriate type if the count is omitted, or a pointer to the
+ appropriate number of objects of the appropriate type if the
+ count is specified.
+ * the buffer supplied to pack/unpack must be of sufficient length
+ to hold all the data, or the behavior is unspecified.
+ * the file provided to the "f" versions of the functions must be
+ open in the appropriate mode, or the behavior is unspecified.
+ * the file supplied to funpackf must be of sufficient length to
+ hold all the data, or the behavior is unspecified.
+ * the behavior of all functions is unspecified if the format string
+ is incorrectly-formed.
+
+ Data-type specifiers:
+ x skipped byte; no corresponding argument
+ b byte
+ s two-byte two's-complement integer
+ i four-byte two's-complement integer
+ l eight-byte two's-complement integer
+ f four-byte IEEE754 float
+ d eight-byte IEEE754 double
+
+ Byte-order specifiers:
+ L little-endian
+ B big-endian
+ H host's native byte order
+ N network byte order
+ */
#ifndef ALREADY_DID_BINIO_STDINT
#define ALREADY_DID_BINIO_STDINT
#if defined(BinIO_STDINT_HEADER)
#include BinIO_STDINT_HEADER
- typedef float float32_t;
- typedef double float64_t;
+ typedef float float32_t;
+ typedef double float64_t;
#else
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
- typedef unsigned long uint32_t;
+ typedef unsigned char uint8_t;
+ typedef unsigned short uint16_t;
+ typedef unsigned long uint32_t;
#ifdef WIN32
- typedef unsigned __int64 uint64_t;
+ typedef unsigned __int64 uint64_t;
#else
- typedef unsigned long long uint64_t;
+ typedef unsigned long long uint64_t;
#endif
- typedef float float32_t;
- typedef double float64_t;
+ typedef float float32_t;
+ typedef double float64_t;
#endif
#endif
- typedef struct
- {
- float64_t d;
- uint64_t l;
- int i;
- float32_t f;
- uint16_t s;
- uint8_t b;
- }
- test_data;
-
- extern void packf ( const char *format, ...);
- extern void spackf (void *buffer, const char *format, ...);
- extern void fpackf (FILE *file, const char *format, ...);
- extern void vspackf (void *buffer, const char *format, va_list args);
- extern void vfpackf (FILE *file, const char *format, va_list args);
-
- extern void unpackf ( const char *format, ...);
- extern void sunpackf (const void *buffer, const char *format, ...);
- extern void funpackf (FILE *file, const char *format, ...);
- extern void vsunpackf(const void *buffer, const char *format, va_list args);
- extern void vfunpackf(FILE *file, const char *format, va_list args);
+ typedef struct {
+ float64_t d;
+ uint64_t l;
+ int i;
+ float32_t f;
+ uint16_t s;
+ uint8_t b;
+ }
+ test_data;
+
+ extern void packf ( const char *format, ...);
+ extern void spackf (void *buffer, const char *format, ...);
+ extern void fpackf (FILE *file, const char *format, ...);
+ extern void vspackf (void *buffer, const char *format, va_list args);
+ extern void vfpackf (FILE *file, const char *format, va_list args);
+
+ extern void unpackf ( const char *format, ...);
+ extern void sunpackf (const void *buffer, const char *format, ...);
+ extern void funpackf (FILE *file, const char *format, ...);
+ extern void vsunpackf(const void *buffer, const char *format, va_list args);
+ extern void vfunpackf(FILE *file, const char *format, va_list args);
#ifdef _MSC_VER
- #ifndef va_copy
- #define va_copy(dest,src) do { dest = src; } while (0)
- #endif
+#ifndef va_copy
+#define va_copy(dest,src) do { dest = src; } while (0)
+#endif
#endif
#if defined(__cplusplus)
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
return false;
*func = dlsym(aldlhandle, funcname);
- if (*func == NULL)
- {
+ if (*func == NULL) {
fprintf(stderr, "Failed to find OpenAL symbol \"%s\" in \"%s\"\n",
- funcname, libname);
+ funcname, libname);
return false;
}
return true;
static void unload_alsyms(void)
{
- #define AL_FUNC(t,ret,fn,params,call,rt) p##fn = NULL;
- #include "alstubs.h"
- #undef AL_FUNC
- if (aldlhandle)
- {
+#define AL_FUNC(t,ret,fn,params,call,rt) p##fn = NULL;
+#include "alstubs.h"
+#undef AL_FUNC
+ if (aldlhandle) {
dlclose(aldlhandle);
aldlhandle = NULL;
}
static bool lookup_all_alsyms(const char *libname)
{
- if (!aldlhandle)
- {
+ if (!aldlhandle) {
if ( (aldlhandle = dlopen(libname, RTLD_GLOBAL | RTLD_NOW)) == NULL )
return false;
}
bool retval = true;
- #define AL_FUNC(t,ret,fn,params,call,rt) \
+#define AL_FUNC(t,ret,fn,params,call,rt) \
if (!lookup_alsym(#fn, (void **) &p##fn, libname)) retval = false;
- #include "alstubs.h"
- #undef AL_FUNC
+#include "alstubs.h"
+#undef AL_FUNC
if (!retval)
unload_alsyms();
#define unload_alsyms()
#endif
-typedef struct
-{
+typedef struct {
ALuint sid;
OPENAL_SAMPLE *sample;
bool startpaused;
float position[3];
} OPENAL_Channels;
-typedef struct OPENAL_SAMPLE
-{
+typedef struct OPENAL_SAMPLE {
char *name;
ALuint bid; // buffer id.
int mode;
const ALuint sid = chan->sid;
const bool no_attenuate = sptr->is2d;
- if (no_attenuate)
- {
+ if (no_attenuate) {
alSourcei(sid, AL_SOURCE_RELATIVE, AL_TRUE);
alSource3f(sid, AL_POSITION, 0.0f, 0.0f, 0.0f);
- }
- else
- {
+ } else {
alSourcei(sid, AL_SOURCE_RELATIVE, AL_FALSE);
alSource3f(sid, AL_POSITION, x, y, z);
}
AL_API void OPENAL_3D_Listener_SetAttributes(const float *pos, const float *vel, float fx, float fy, float fz, float tx, float ty, float tz)
{
if (!initialized) return;
- if (pos != NULL)
- {
+ if (pos != NULL) {
alListener3f(AL_POSITION, pos[0], pos[1], -pos[2]);
listener_position[0] = pos[0];
listener_position[1] = pos[1];
// we ignore velocity, since doppler's broken in the Linux AL at the moment...
// adjust existing positions...
- for (int i = 0; i < num_channels; i++)
- {
+ for (int i = 0; i < num_channels; i++) {
const float *p = impl_channels[i].position;
set_channel_position(i, p[0], p[1], p[2]);
}
if (flags != 0) // unsupported.
return false;
- if (!lookup_all_alsyms("./openal.so")) // !!! FIXME: linux specific lib name
- {
- if (!lookup_all_alsyms("openal.so.1")) // !!! FIXME: linux specific lib name
- {
+ if (!lookup_all_alsyms("./openal.so")) { // !!! FIXME: linux specific lib name
+ if (!lookup_all_alsyms("openal.so.1")) { // !!! FIXME: linux specific lib name
if (!lookup_all_alsyms("openal.so")) // !!! FIXME: linux specific lib name
return false;
}
ALint caps[] = { ALC_FREQUENCY, mixrate, 0 };
ALCcontext *ctx = alcCreateContext(dev, caps);
- if (!ctx)
- {
+ if (!ctx) {
alcCloseDevice(dev);
return false;
}
alcMakeContextCurrent(ctx);
alcProcessContext(ctx);
- bool cmdline(const char *cmd);
- if (cmdline("openalinfo"))
- {
+ bool cmdline(const char * cmd);
+ if (cmdline("openalinfo")) {
printf("AL_VENDOR: %s\n", (char *) alGetString(AL_VENDOR));
printf("AL_RENDERER: %s\n", (char *) alGetString(AL_RENDERER));
printf("AL_VERSION: %s\n", (char *) alGetString(AL_VERSION));
if (!initialized) return;
ALCcontext *ctx = alcGetCurrentContext();
- if (ctx)
- {
- for (int i = 0; i < num_channels; i++)
- {
+ if (ctx) {
+ for (int i = 0; i < num_channels; i++) {
alSourceStop(impl_channels[i].sid);
alSourcei(impl_channels[i].sid, AL_BUFFER, 0);
alDeleteSources(1, &impl_channels[i].sid);
if (!initialized) return -1;
if (sptr == NULL) return -1;
if (dsp != NULL) return -1;
- if (channel == OPENAL_FREE)
- {
- for (int i = 0; i < num_channels; i++)
- {
+ if (channel == OPENAL_FREE) {
+ for (int i = 0; i < num_channels; i++) {
ALint state = 0;
alGetSourceiv(impl_channels[i].sid, AL_SOURCE_STATE, &state);
- if ((state != AL_PLAYING) && (state != AL_PAUSED))
- {
+ if ((state != AL_PLAYING) && (state != AL_PAUSED)) {
channel = i;
break;
}
strcat(fname, ".ogg");
// just in case...
- #undef fopen
+#undef fopen
FILE *io = fopen(fname, "rb");
if (io == NULL)
return NULL;
ALubyte *retval = NULL;
- #if 0 // untested, so disable this!
+#if 0 // untested, so disable this!
// Can we just feed it to the AL compressed?
- if (alIsExtensionPresent((const ALubyte *) "AL_EXT_vorbis"))
- {
+ if (alIsExtensionPresent((const ALubyte *) "AL_EXT_vorbis")) {
format = alGetEnumValue((const ALubyte *) "AL_FORMAT_VORBIS_EXT");
freq = 44100;
fseek(io, 0, SEEK_END);
retval = (ALubyte *) malloc(size);
size_t rc = fread(retval, size, 1, io);
fclose(io);
- if (rc != 1)
- {
+ if (rc != 1) {
free(retval);
return NULL;
}
return retval;
}
- #endif
+#endif
// Uncompress and feed to the AL.
OggVorbis_File vf;
memset(&vf, '\0', sizeof (vf));
- if (ov_open(io, &vf, NULL, 0) == 0)
- {
+ if (ov_open(io, &vf, NULL, 0) == 0) {
int bitstream = 0;
vorbis_info *info = ov_info(&vf, -1);
size = 0;
format = (info->channels == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
freq = info->rate;
- if ((info->channels != 1) && (info->channels != 2))
- {
+ if ((info->channels != 1) && (info->channels != 2)) {
ov_clear(&vf);
return NULL;
}
long rc = 0;
size_t allocated = 64 * 1024;
retval = (ALubyte *) malloc(allocated);
- while ( (rc = ov_read(&vf, buf, sizeof (buf), bigendian, 2, 1, &bitstream)) != 0 )
- {
- if (rc > 0)
- {
+ while ( (rc = ov_read(&vf, buf, sizeof (buf), bigendian, 2, 1, &bitstream)) != 0 ) {
+ if (rc > 0) {
size += rc;
- if (size >= allocated)
- {
+ if (size >= allocated) {
allocated *= 2;
ALubyte *tmp = (ALubyte *) realloc(retval, allocated);
- if (tmp == NULL)
- {
+ if (tmp == NULL) {
free(retval);
retval = NULL;
break;
ALuint bid = 0;
alGetError();
alGenBuffers(1, &bid);
- if (alGetError() == AL_NO_ERROR)
- {
+ if (alGetError() == AL_NO_ERROR) {
alBufferData(bid, format, data, size, frequency);
retval = new OPENAL_SAMPLE;
retval->bid = bid;
AL_API void OPENAL_Sample_Free(OPENAL_SAMPLE *sptr)
{
if (!initialized) return;
- if (sptr)
- {
- for (int i = 0; i < num_channels; i++)
- {
- if (impl_channels[i].sample == sptr)
- {
+ if (sptr) {
+ for (int i = 0; i < num_channels; i++) {
+ if (impl_channels[i].sample == sptr) {
alSourceStop(impl_channels[i].sid);
alSourcei(impl_channels[i].sid, AL_BUFFER, 0);
impl_channels[i].sample = NULL;
AL_API signed char OPENAL_SetFrequency(int channel, int freq)
{
if (!initialized) return false;
- if (channel == OPENAL_ALL)
- {
+ if (channel == OPENAL_ALL) {
for (int i = 0; i < num_channels; i++)
OPENAL_SetFrequency(i, freq);
return true;
{
if (!initialized) return false;
- if (channel == OPENAL_ALL)
- {
+ if (channel == OPENAL_ALL) {
for (int i = 0; i < num_channels; i++)
OPENAL_SetVolume(i, vol);
return true;
{
if (!initialized) return false;
- if (channel == OPENAL_ALL)
- {
+ if (channel == OPENAL_ALL) {
for (int i = 0; i < num_channels; i++)
OPENAL_SetPaused(i, paused);
return true;
if ((paused) && (state == AL_PLAYING))
alSourcePause(impl_channels[channel].sid);
- else if ((!paused) && (state == AL_PAUSED))
- {
+ else if ((!paused) && (state == AL_PAUSED)) {
alSourcePlay(impl_channels[channel].sid);
impl_channels[channel].startpaused = false;
}
{
if (!initialized) return false;
- if (channel == OPENAL_ALL)
- {
+ if (channel == OPENAL_ALL) {
for (int i = 0; i < num_channels; i++)
OPENAL_StopSound(i);
return true;
static signed char OPENAL_Stream_Stop(OPENAL_STREAM *stream)
{
if (!initialized) return false;
- for (int i = 0; i < num_channels; i++)
- {
- if (impl_channels[i].sample == (OPENAL_SAMPLE *) stream)
- {
+ for (int i = 0; i < num_channels; i++) {
+ if (impl_channels[i].sample == (OPENAL_SAMPLE *) stream) {
alSourceStop(impl_channels[i].sid);
impl_channels[i].startpaused = false;
}
extern "C" void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
{
- const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
- if (currSample && currSample == samp[chan])
- {
- if (OPENAL_GetPaused(channels[chan]))
- {
- OPENAL_StopSound(channels[chan]);
- channels[chan] = OPENAL_FREE;
- }
- else if (OPENAL_IsPlaying(channels[chan]))
- {
- int loop_mode = OPENAL_GetLoopMode(channels[chan]);
- if (loop_mode & OPENAL_LOOP_OFF)
- {
- channels[chan] = OPENAL_FREE;
- }
- }
- }
- else
- {
- channels[chan] = OPENAL_FREE;
- }
-
- channels[chan] = OPENAL_PlaySoundEx(channels[chan], sptr, dsp, startpaused);
- if (channels[chan] < 0)
- {
- channels[chan] = OPENAL_PlaySoundEx(OPENAL_FREE, sptr, dsp, startpaused);
- }
+ const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
+ if (currSample && currSample == samp[chan]) {
+ if (OPENAL_GetPaused(channels[chan])) {
+ OPENAL_StopSound(channels[chan]);
+ channels[chan] = OPENAL_FREE;
+ } else if (OPENAL_IsPlaying(channels[chan])) {
+ int loop_mode = OPENAL_GetLoopMode(channels[chan]);
+ if (loop_mode & OPENAL_LOOP_OFF) {
+ channels[chan] = OPENAL_FREE;
+ }
+ }
+ } else {
+ channels[chan] = OPENAL_FREE;
+ }
+
+ channels[chan] = OPENAL_PlaySoundEx(channels[chan], sptr, dsp, startpaused);
+ if (channels[chan] < 0) {
+ channels[chan] = OPENAL_PlaySoundEx(OPENAL_FREE, sptr, dsp, startpaused);
+ }
}
extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
{
- const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
- if (currSample && currSample == OPENAL_Stream_GetSample(sptr))
- {
- OPENAL_StopSound(channels[chan]);
- OPENAL_Stream_Stop(sptr);
- }
- else
- {
- OPENAL_Stream_Stop(sptr);
- channels[chan] = OPENAL_FREE;
- }
-
- channels[chan] = OPENAL_Stream_PlayEx(channels[chan], sptr, dsp, startpaused);
- if (channels[chan] < 0)
- {
- channels[chan] = OPENAL_Stream_PlayEx(OPENAL_FREE, sptr, dsp, startpaused);
- }
+ const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
+ if (currSample && currSample == OPENAL_Stream_GetSample(sptr)) {
+ OPENAL_StopSound(channels[chan]);
+ OPENAL_Stream_Stop(sptr);
+ } else {
+ OPENAL_Stream_Stop(sptr);
+ channels[chan] = OPENAL_FREE;
+ }
+
+ channels[chan] = OPENAL_Stream_PlayEx(channels[chan], sptr, dsp, startpaused);
+ if (channels[chan] < 0) {
+ channels[chan] = OPENAL_Stream_PlayEx(OPENAL_FREE, sptr, dsp, startpaused);
+ }
}
#endif
typedef OPENAL_SAMPLE OPENAL_STREAM;
typedef struct OPENAL_DSPUNIT OPENAL_DSPUNIT;
-enum OPENAL_OUTPUTTYPES
-{
- OPENAL_OUTPUT_NOSOUND, /* NoSound driver, all calls to this succeed but do nothing. */
- OPENAL_OUTPUT_OSS, /* Linux/Unix OSS (Open Sound System) driver, i.e. the kernel sound drivers. */
- OPENAL_OUTPUT_ALSA, /* Linux Alsa driver. */
+enum OPENAL_OUTPUTTYPES {
+ OPENAL_OUTPUT_NOSOUND, /* NoSound driver, all calls to this succeed but do nothing. */
+ OPENAL_OUTPUT_OSS, /* Linux/Unix OSS (Open Sound System) driver, i.e. the kernel sound drivers. */
+ OPENAL_OUTPUT_ALSA, /* Linux Alsa driver. */
};
#define OPENAL_LOOP_OFF 0x00000001 /* For non looping samples. */
#undef AL_API
#define AL_API
-AL_API void OPENAL_3D_Listener_SetAttributes(const float *pos, const float *vel, float fx, float fy, float fz, float tx, float ty, float tz);
-AL_API signed char OPENAL_3D_SetAttributes(int channel, const float *pos, const float *vel);
-AL_API signed char OPENAL_3D_SetAttributes_(int channel, const XYZ &pos, const float *vel);
-AL_API signed char OPENAL_Init(int mixrate, int maxsoftwarechannels, unsigned int flags);
-AL_API void OPENAL_Close();
-AL_API OPENAL_SAMPLE *OPENAL_Sample_Load(int index, const char *name_or_data, unsigned int mode, int offset, int length);
-AL_API void OPENAL_Sample_Free(OPENAL_SAMPLE *sptr);
-AL_API signed char OPENAL_SetFrequency(int channel, int freq);
-AL_API signed char OPENAL_SetVolume(int channel, int vol);
-AL_API signed char OPENAL_SetPaused(int channel, signed char paused);
-AL_API void OPENAL_SetSFXMasterVolume(int volume);
-AL_API signed char OPENAL_StopSound(int channel);
-AL_API void OPENAL_Stream_Close(OPENAL_STREAM *stream);
-AL_API signed char OPENAL_Stream_SetMode(OPENAL_STREAM *stream, unsigned int mode);
-AL_API void OPENAL_Update();
-AL_API signed char OPENAL_SetOutput(int outputtype);
-void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
-void PlayStreamEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
+ AL_API void OPENAL_3D_Listener_SetAttributes(const float *pos, const float *vel, float fx, float fy, float fz, float tx, float ty, float tz);
+ AL_API signed char OPENAL_3D_SetAttributes(int channel, const float *pos, const float *vel);
+ AL_API signed char OPENAL_3D_SetAttributes_(int channel, const XYZ &pos, const float *vel);
+ AL_API signed char OPENAL_Init(int mixrate, int maxsoftwarechannels, unsigned int flags);
+ AL_API void OPENAL_Close();
+ AL_API OPENAL_SAMPLE *OPENAL_Sample_Load(int index, const char *name_or_data, unsigned int mode, int offset, int length);
+ AL_API void OPENAL_Sample_Free(OPENAL_SAMPLE *sptr);
+ AL_API signed char OPENAL_SetFrequency(int channel, int freq);
+ AL_API signed char OPENAL_SetVolume(int channel, int vol);
+ AL_API signed char OPENAL_SetPaused(int channel, signed char paused);
+ AL_API void OPENAL_SetSFXMasterVolume(int volume);
+ AL_API signed char OPENAL_StopSound(int channel);
+ AL_API void OPENAL_Stream_Close(OPENAL_STREAM *stream);
+ AL_API signed char OPENAL_Stream_SetMode(OPENAL_STREAM *stream, unsigned int mode);
+ AL_API void OPENAL_Update();
+ AL_API signed char OPENAL_SetOutput(int outputtype);
+ void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
+ void PlayStreamEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
#ifdef __cplusplus
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#include "binio.h"
#include "private.h"
-struct BinIOPackContext
-{
+struct BinIOPackContext {
uint8_t *buffer;
va_list args;
};
static void BinIOPack(void *context, int type, int byte_order, int count)
{
struct BinIOPackContext *ctx = (struct BinIOPackContext*)context;
- if (count == -1)
- {
- switch (type)
- {
- case BinIO_TYPE_IGNORE_BYTE:
- {
- ctx->buffer += 1;
- }
- break;
- case BinIO_TYPE_BYTE:
- {
- uint8_t value = va_arg(ctx->args, int);
- BinIOConvert1(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
- ctx->buffer += 1;
- }
- break;
- case BinIO_TYPE_INT16:
- {
- uint16_t value = va_arg(ctx->args, int);
- BinIOConvert2(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
- ctx->buffer += 2;
- }
- break;
- case BinIO_TYPE_INT32:
- {
- int value = va_arg(ctx->args, int);
- BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
- ctx->buffer += 4;
- }
- break;
- case BinIO_TYPE_INT64:
- {
- uint64_t value = va_arg(ctx->args, uint64_t);
- BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
- ctx->buffer += 8;
- }
- break;
- case BinIO_TYPE_FLOAT32:
- {
- float32_t value = (float32_t)va_arg(ctx->args, double);
- BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
- ctx->buffer += 4;
- }
- break;
- case BinIO_TYPE_FLOAT64:
- {
- float64_t value = va_arg(ctx->args, float64_t);
- BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
- ctx->buffer += 8;
- }
- break;
+ if (count == -1) {
+ switch (type) {
+ case BinIO_TYPE_IGNORE_BYTE: {
+ ctx->buffer += 1;
}
- }
- else
- {
- switch (type)
- {
- case BinIO_TYPE_IGNORE_BYTE: ctx->buffer += 1 * count; break;
- case BinIO_TYPE_BYTE: BinIOConvert1(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 1 * count; break;
- case BinIO_TYPE_INT16: BinIOConvert2(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 2 * count; break;
- case BinIO_TYPE_INT32: BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 4 * count; break;
- case BinIO_TYPE_INT64: BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 8 * count; break;
- case BinIO_TYPE_FLOAT32: BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 4 * count; break;
- case BinIO_TYPE_FLOAT64: BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 8 * count; break;
+ break;
+ case BinIO_TYPE_BYTE: {
+ uint8_t value = va_arg(ctx->args, int);
+ BinIOConvert1(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+ ctx->buffer += 1;
+ }
+ break;
+ case BinIO_TYPE_INT16: {
+ uint16_t value = va_arg(ctx->args, int);
+ BinIOConvert2(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+ ctx->buffer += 2;
+ }
+ break;
+ case BinIO_TYPE_INT32: {
+ int value = va_arg(ctx->args, int);
+ BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+ ctx->buffer += 4;
+ }
+ break;
+ case BinIO_TYPE_INT64: {
+ uint64_t value = va_arg(ctx->args, uint64_t);
+ BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+ ctx->buffer += 8;
+ }
+ break;
+ case BinIO_TYPE_FLOAT32: {
+ float32_t value = (float32_t)va_arg(ctx->args, double);
+ BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+ ctx->buffer += 4;
+ }
+ break;
+ case BinIO_TYPE_FLOAT64: {
+ float64_t value = va_arg(ctx->args, float64_t);
+ BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+ ctx->buffer += 8;
+ }
+ break;
+ }
+ } else {
+ switch (type) {
+ case BinIO_TYPE_IGNORE_BYTE:
+ ctx->buffer += 1 * count;
+ break;
+ case BinIO_TYPE_BYTE:
+ BinIOConvert1(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+ ctx->buffer += 1 * count;
+ break;
+ case BinIO_TYPE_INT16:
+ BinIOConvert2(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+ ctx->buffer += 2 * count;
+ break;
+ case BinIO_TYPE_INT32:
+ BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+ ctx->buffer += 4 * count;
+ break;
+ case BinIO_TYPE_INT64:
+ BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+ ctx->buffer += 8 * count;
+ break;
+ case BinIO_TYPE_FLOAT32:
+ BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+ ctx->buffer += 4 * count;
+ break;
+ case BinIO_TYPE_FLOAT64:
+ BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+ ctx->buffer += 8 * count;
+ break;
}
}
}
{
size_t n_bytes = BinIOFormatByteCount(format);
void* buffer = malloc(n_bytes);
-
+
vspackf(buffer, format, args);
-
+
fwrite(buffer, n_bytes, 1, file);
free(buffer);
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
unsigned int count)
{
if (BinIONormalizeByteOrder(from_byte_order) !=
- BinIONormalizeByteOrder(to_byte_order))
- {
+ BinIONormalizeByteOrder(to_byte_order)) {
unsigned int i;
- for (i = 0; i < count; ++i)
- {
+ for (i = 0; i < count; ++i) {
BinIOSwap1(src, dst);
src += 1;
dst += 1;
}
- }
- else
- {
+ } else {
memcpy(dst, src, 1 * count);
}
}
unsigned int count)
{
if (BinIONormalizeByteOrder(from_byte_order) !=
- BinIONormalizeByteOrder(to_byte_order))
- {
+ BinIONormalizeByteOrder(to_byte_order)) {
unsigned int i;
- for (i = 0; i < count; ++i)
- {
+ for (i = 0; i < count; ++i) {
BinIOSwap2(src, dst);
src += 2;
dst += 2;
}
- }
- else
- {
+ } else {
memcpy(dst, src, 2 * count);
}
}
unsigned int count)
{
if (BinIONormalizeByteOrder(from_byte_order) !=
- BinIONormalizeByteOrder(to_byte_order))
- {
+ BinIONormalizeByteOrder(to_byte_order)) {
unsigned int i;
- for (i = 0; i < count; ++i)
- {
+ for (i = 0; i < count; ++i) {
BinIOSwap4(src, dst);
src += 4;
dst += 4;
}
- }
- else
- {
+ } else {
memcpy(dst, src, 4 * count);
}
}
unsigned int count)
{
if (BinIONormalizeByteOrder(from_byte_order) !=
- BinIONormalizeByteOrder(to_byte_order))
- {
+ BinIONormalizeByteOrder(to_byte_order)) {
unsigned int i;
- for (i = 0; i < count; ++i)
- {
+ for (i = 0; i < count; ++i) {
BinIOSwap8(src, dst);
src += 8;
dst += 8;
}
- }
- else
- {
+ } else {
memcpy(dst, src, 8 * count);
}
}
{
int count, value;
int c;
- switch (c = *(cursor->cursor)++)
- {
- case BinIO_LITTLE_ENDIAN_BYTE_ORDER:
- case BinIO_BIG_ENDIAN_BYTE_ORDER:
- case BinIO_HOST_BYTE_ORDER:
- case BinIO_NETWORK_BYTE_ORDER:
- cursor->byte_order = c;
- break;
-
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- count = cursor->count;
- value = c - '0';
- if (count == -1)
- {
- cursor->count = value;
- }
- else
- {
- cursor->count = (count * 10) + value;
- }
- break;
-
- case BinIO_TYPE_IGNORE_BYTE:
- case BinIO_TYPE_BYTE:
- case BinIO_TYPE_INT16:
- case BinIO_TYPE_INT32:
- case BinIO_TYPE_INT64:
- case BinIO_TYPE_FLOAT32:
- case BinIO_TYPE_FLOAT64:
- func(context, c, cursor->byte_order, cursor->count);
- cursor->byte_order = BinIO_HOST_BYTE_ORDER;
- cursor->count = -1;
- break;
-
- case ' ': case '\t': case '\r': case '\n':
- break;
-
- default:
- return 0;
+ switch (c = *(cursor->cursor)++) {
+ case BinIO_LITTLE_ENDIAN_BYTE_ORDER:
+ case BinIO_BIG_ENDIAN_BYTE_ORDER:
+ case BinIO_HOST_BYTE_ORDER:
+ case BinIO_NETWORK_BYTE_ORDER:
+ cursor->byte_order = c;
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ count = cursor->count;
+ value = c - '0';
+ if (count == -1) {
+ cursor->count = value;
+ } else {
+ cursor->count = (count * 10) + value;
+ }
+ break;
+
+ case BinIO_TYPE_IGNORE_BYTE:
+ case BinIO_TYPE_BYTE:
+ case BinIO_TYPE_INT16:
+ case BinIO_TYPE_INT32:
+ case BinIO_TYPE_INT64:
+ case BinIO_TYPE_FLOAT32:
+ case BinIO_TYPE_FLOAT64:
+ func(context, c, cursor->byte_order, cursor->count);
+ cursor->byte_order = BinIO_HOST_BYTE_ORDER;
+ cursor->count = -1;
+ break;
+
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ break;
+
+ default:
+ return 0;
}
-
+
return 1;
}
extern void BinIOCountBytes(void *context, int type, int byte_order, int count)
{
size_t type_size = 0;
-
- if (count == -1)
- {
+
+ if (count == -1) {
count = 1;
}
-
- switch (type)
- {
- case BinIO_TYPE_IGNORE_BYTE: type_size = 1; break;
- case BinIO_TYPE_BYTE: type_size = 1; break;
- case BinIO_TYPE_INT16: type_size = 2; break;
- case BinIO_TYPE_INT32: type_size = 4; break;
- case BinIO_TYPE_INT64: type_size = 8; break;
- case BinIO_TYPE_FLOAT32: type_size = 4; break;
- case BinIO_TYPE_FLOAT64: type_size = 8; break;
+
+ switch (type) {
+ case BinIO_TYPE_IGNORE_BYTE:
+ type_size = 1;
+ break;
+ case BinIO_TYPE_BYTE:
+ type_size = 1;
+ break;
+ case BinIO_TYPE_INT16:
+ type_size = 2;
+ break;
+ case BinIO_TYPE_INT32:
+ type_size = 4;
+ break;
+ case BinIO_TYPE_INT64:
+ type_size = 8;
+ break;
+ case BinIO_TYPE_FLOAT32:
+ type_size = 4;
+ break;
+ case BinIO_TYPE_FLOAT64:
+ type_size = 8;
+ break;
}
-
+
*(size_t*)context += type_size * count;
}
size_t n_bytes = 0;
BinIOInitFormatCursor(&cursor, format);
-
+
while (BinIONextChar(&n_bytes, &cursor, BinIOCountBytes)) {}
-
+
return n_bytes;
}
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
#ifdef WIN32
- typedef unsigned __int64 uint64_t;
+typedef unsigned __int64 uint64_t;
#else
- typedef unsigned long long uint64_t;
+typedef unsigned long long uint64_t;
#endif
typedef float float32_t;
typedef double float64_t;
BinIO_INLINE int BinIONormalizeByteOrder(int byte_order)
{
- if (byte_order == BinIO_HOST_BYTE_ORDER)
- {
+ if (byte_order == BinIO_HOST_BYTE_ORDER) {
byte_order = BinIO_BYTE_ORDER;
- }
- else if (byte_order == BinIO_NETWORK_BYTE_ORDER)
- {
+ } else if (byte_order == BinIO_NETWORK_BYTE_ORDER) {
byte_order = BinIO_BIG_ENDIAN_BYTE_ORDER;
}
-
+
return byte_order;
}
const uint8_t *src, uint8_t *dst,
unsigned int count);
-struct BinIOFormatCursor
-{
+struct BinIOFormatCursor {
const char *cursor;
int byte_order;
int count;
This program 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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
#include "binio.h"
#include "private.h"
-struct BinIOUnpackContext
-{
+struct BinIOUnpackContext {
const uint8_t *data;
va_list args;
};
static void BinIOUnpack(void *context, int type, int byte_order, int count)
{
struct BinIOUnpackContext *ctx = (struct BinIOUnpackContext*)context;
- if (count == -1)
- {
+ if (count == -1) {
count = 1;
}
- switch (type)
- {
- case BinIO_TYPE_IGNORE_BYTE: ctx->data += 1 * count; break;
- case BinIO_TYPE_BYTE: BinIOConvert1(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 1 * count; break;
- case BinIO_TYPE_INT16: BinIOConvert2(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 2 * count; break;
- case BinIO_TYPE_INT32: BinIOConvert4(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 4 * count; break;
- case BinIO_TYPE_INT64: BinIOConvert8(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 8 * count; break;
- case BinIO_TYPE_FLOAT32: BinIOConvert4(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 4 * count; break;
- case BinIO_TYPE_FLOAT64: BinIOConvert8(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 8 * count; break;
+ switch (type) {
+ case BinIO_TYPE_IGNORE_BYTE:
+ ctx->data += 1 * count;
+ break;
+ case BinIO_TYPE_BYTE:
+ BinIOConvert1(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+ ctx->data += 1 * count;
+ break;
+ case BinIO_TYPE_INT16:
+ BinIOConvert2(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+ ctx->data += 2 * count;
+ break;
+ case BinIO_TYPE_INT32:
+ BinIOConvert4(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+ ctx->data += 4 * count;
+ break;
+ case BinIO_TYPE_INT64:
+ BinIOConvert8(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+ ctx->data += 8 * count;
+ break;
+ case BinIO_TYPE_FLOAT32:
+ BinIOConvert4(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+ ctx->data += 4 * count;
+ break;
+ case BinIO_TYPE_FLOAT64:
+ BinIOConvert8(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+ ctx->data += 8 * count;
+ break;
}
}
struct BinIOUnpackContext context;
BinIOInitFormatCursor(&cursor, format);
-
+
context.data = (const unsigned char*)buffer;
va_copy(context.args, args);
-
+
while (BinIONextChar(&context, &cursor, BinIOUnpack)) {}
va_end(context.args);
size_t n_bytes = BinIOFormatByteCount(format);
void* buffer = malloc(n_bytes);
fread(buffer, n_bytes, 1, file);
-
+
vsunpackf(buffer, format, args);
-
+
free(buffer);
}