diff --git a/base/botfiles/bots/angelyss_c.c b/base/botfiles/bots/angelyss_c.c
new file mode 100644
index 00000000..1a6bff0d
--- /dev/null
+++ b/base/botfiles/bots/angelyss_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Angelyss"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.3
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/angelyss_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.3
+ CHARACTERISTIC_AIM_ACCURACY 0.3
+ CHARACTERISTIC_VIEW_FACTOR 0.3
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 1.5
+
+ CHARACTERISTIC_CHAT_FILE "bots/angelyss_t.c"
+ CHARACTERISTIC_CHAT_NAME "angelyss"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/angelyss_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.43
+
+ CHARACTERISTIC_FIRETHROTTLE 0.43
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Angelyss"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/angelyss_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/angelyss_t.c"
+ CHARACTERISTIC_CHAT_NAME "angelyss"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/angelyss_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.95
+
+ CHARACTERISTIC_FIRETHROTTLE 0.1
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Angelyss"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/angelyss_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/angelyss_t.c"
+ CHARACTERISTIC_CHAT_NAME "angelyss"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/angelyss_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 0.01
+}
diff --git a/base/botfiles/bots/angelyss_i.c b/base/botfiles/bots/angelyss_i.c
new file mode 100644
index 00000000..79f4b555
--- /dev/null
+++ b/base/botfiles/bots/angelyss_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 300
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 350
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 175
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/angelyss_t.c b/base/botfiles/bots/angelyss_t.c
new file mode 100644
index 00000000..bc84136e
--- /dev/null
+++ b/base/botfiles/bots/angelyss_t.c
@@ -0,0 +1,289 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Angelyss"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ "Are you prepared for pain?";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ 4, " kinda wears on me, I think I'll find a different server, later ~peeps";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ "HA! ", 3, " is at the bottom, as usual.";
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ "I can remember when ", 4, " didn't suck.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ "I really like ", 4, " since they fixed it, it is so easy to win!";
+ "Next time, don't bother.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ "Hey jerk! I was trying to hold a conversation here... do you mind?";
+ "Jerk";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ "You need to aim better.";
+ "Try harder next time.";
+ curse;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Dammit! Why won't you die?!?";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "this one time, at band camp...";
+ GRRLTALK1;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, ".";
+ "Next time you see Gargoyle tell him to call me, mmmkay?";
+ neuterbot, " is cute.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/angelyss_w.c b/base/botfiles/bots/angelyss_w.c
new file mode 100644
index 00000000..6d996d63
--- /dev/null
+++ b/base/botfiles/bots/angelyss_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 40
+//shotgun
+#define SGW 110
+//machinegun
+#define MGW 90
+//grenade launcher
+#define GLW 170
+//rocket launcher
+#define RLW 160
+//railgun
+#define RGW 150
+//bfg10k
+#define BFW 90
+//lightninggun
+#define LGW 200
+//plasmagun
+#define PGW 210
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 140
+//nailgun
+#define NGW 190
+//chaingun
+#define CGW 125
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/arachna_c.c b/base/botfiles/bots/arachna_c.c
new file mode 100644
index 00000000..6057fdd1
--- /dev/null
+++ b/base/botfiles/bots/arachna_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Arachna"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/arachna_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/arachna_t.c"
+ CHARACTERISTIC_CHAT_NAME "arachna"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.5
+ CHARACTERISTIC_CHAT_MISC 0.5
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5
+ CHARACTERISTIC_CHAT_KILL 0.5
+ CHARACTERISTIC_CHAT_DEATH 0.5
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.5
+ CHARACTERISTIC_CHAT_HITNOKILL 0.5
+ CHARACTERISTIC_CHAT_RANDOM 0.5
+ CHARACTERISTIC_CHAT_REPLY 0.5
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/arachna_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.3
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Arachna"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/arachna_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/arachna_t.c"
+ CHARACTERISTIC_CHAT_NAME "arachna"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/arachna_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Arachna"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/arachna_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/arachna_t.c"
+ CHARACTERISTIC_CHAT_NAME "arachna"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/arachna_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/arachna_i.c b/base/botfiles/bots/arachna_i.c
new file mode 100644
index 00000000..b620615c
--- /dev/null
+++ b/base/botfiles/bots/arachna_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 15
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/arachna_t.c b/base/botfiles/bots/arachna_t.c
new file mode 100644
index 00000000..72b3c08d
--- /dev/null
+++ b/base/botfiles/bots/arachna_t.c
@@ -0,0 +1,275 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Arachna"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+ "This is why the upper classes are called the 'ruling elite.'";
+ "Why do the lower classes think they can match someone of my caliber?";
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+ "That was a challenge.";
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ curse;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ GRRLTALK0;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/arachna_w.c b/base/botfiles/bots/arachna_w.c
new file mode 100644
index 00000000..526f40b7
--- /dev/null
+++ b/base/botfiles/bots/arachna_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 25
+//shotgun
+#define SGW 125
+//machinegun
+#define MGW 90
+//grenade launcher
+#define GLW 110
+//rocket launcher
+#define RLW 190
+//railgun
+#define RGW 200
+//bfg10k
+#define BFW 105
+//lightninggun
+#define LGW 120
+//plasmagun
+#define PGW 190
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 130
+//nailgun
+#define NGW 160
+//chaingun
+#define CGW 162
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/ayumi_c.c b/base/botfiles/bots/ayumi_c.c
new file mode 100644
index 00000000..499e655f
--- /dev/null
+++ b/base/botfiles/bots/ayumi_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Ayumi"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/ayumi_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/ayumi_t.c"
+ CHARACTERISTIC_CHAT_NAME "Ayumi"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/ayumi_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.4
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.4
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.4
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.4
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.4
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.4
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.4
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.4
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Ayumi"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/ayumi_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/ayumi_t.c"
+ CHARACTERISTIC_CHAT_NAME "Ayumi"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/ayumi_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.8
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.8
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.7
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.7
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.8
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.8
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.8
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 0.5
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Ayumi"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/ayumi_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/ayumi_t.c"
+ CHARACTERISTIC_CHAT_NAME "Ayumi"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/ayumi_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/ayumi_i.c b/base/botfiles/bots/ayumi_i.c
new file mode 100644
index 00000000..2451c19b
--- /dev/null
+++ b/base/botfiles/bots/ayumi_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 135
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 200
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 75
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/ayumi_t.c b/base/botfiles/bots/ayumi_t.c
new file mode 100644
index 00000000..9258f75c
--- /dev/null
+++ b/base/botfiles/bots/ayumi_t.c
@@ -0,0 +1,251 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Ayumi"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 3, " sucks!";
+ 2, ", I let you win.";
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ LEVEL_END_VICTORY0;
+ LEVEL_END_VICTORY1;
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " must be an Arena Lord.";
+ 1, " kept getting in my way.";
+ 4, " has never been good to me.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ "Try harder next time.";
+ "Wuss";
+ "Heh, you suck.";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "LOL!";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "It burns!";
+ "land conservation";
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ DEATH_SLIME0;
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ "I can't swim!";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ "Aww crap!";
+ "Shutup!";
+ "I meant to do that.";
+ DEATH_SUICIDE2;
+ DEATH_SUICIDE1;
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "D'oh!";
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ KILL_RAIL1;
+ KILL_RAIL0;
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ TELEFRAGGED2;
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ KILL_INSULT2;
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ PRAISE0;
+ PRAISE1;
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ "Your breath stinks";
+ "Get off your dead butt and something for a change.";
+ "Life got you down? Give it up.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+
+ GRRLTALK0;
+ GRRLTALK1;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/ayumi_w.c b/base/botfiles/bots/ayumi_w.c
new file mode 100644
index 00000000..3d142234
--- /dev/null
+++ b/base/botfiles/bots/ayumi_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 25
+//shotgun
+#define SGW 135
+//machinegun
+#define MGW 90
+//grenade launcher
+#define GLW 110
+//rocket launcher
+#define RLW 190
+//railgun
+#define RGW 115
+//bfg10k
+#define BFW 200
+//lightninggun
+#define LGW 150
+//plasmagun
+#define PGW 195
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 210
+//nailgun
+#define NGW 180
+//chaingun
+#define CGW 155
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/beret_c.c b/base/botfiles/bots/beret_c.c
new file mode 100644
index 00000000..f04c51ac
--- /dev/null
+++ b/base/botfiles/bots/beret_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Beret"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/beret_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/beret_t.c"
+ CHARACTERISTIC_CHAT_NAME "beret"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.5
+ CHARACTERISTIC_CHAT_MISC 0.5
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5
+ CHARACTERISTIC_CHAT_KILL 0.5
+ CHARACTERISTIC_CHAT_DEATH 0.5
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.5
+ CHARACTERISTIC_CHAT_HITNOKILL 0.5
+ CHARACTERISTIC_CHAT_RANDOM 0.5
+ CHARACTERISTIC_CHAT_REPLY 0.5
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/beret_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.3
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Beret"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/beret_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/beret_t.c"
+ CHARACTERISTIC_CHAT_NAME "beret"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/beret_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Beret"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/beret_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/beret_t.c"
+ CHARACTERISTIC_CHAT_NAME "beret"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/beret_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/beret_i.c b/base/botfiles/bots/beret_i.c
new file mode 100644
index 00000000..4315f6c4
--- /dev/null
+++ b/base/botfiles/bots/beret_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 40
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/beret_t.c b/base/botfiles/bots/beret_t.c
new file mode 100644
index 00000000..0610928d
--- /dev/null
+++ b/base/botfiles/bots/beret_t.c
@@ -0,0 +1,278 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Beret"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Rectum? It nearly killed him!";
+ 0, " is a loser!";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Your mother is here, got to go.";
+ "Aurevoir mes amis.";
+ 4, " is too slow for me, audios.";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ "Worst level ever!";
+ 0, " is gonna pay.";
+
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 3, " sucks!";
+ 2, ", I let you win.";
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ LEVEL_END_VICTORY0;
+ LEVEL_END_VICTORY1;
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " must be an Arena Lord.";
+ 1, " kept getting in my way.";
+ 4, " has never been good to me.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ "Son of a... you shall pay for that!";
+ "Infidel!!!";
+ "Jerkwad";
+ "Schmuck";
+ "Tosser";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ "Try harder next time.";
+ "Wuss";
+ "Heh, you suck.";
+ "Nice shooting Tex, you need to take lessons from Dick.";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "LOL!";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ DEATH_SLIME0;
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ "I can't swim!";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ "Aww crap!";
+ "Shutup!";
+ DEATH_SUICIDE2;
+ DEATH_SUICIDE1;
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Humiliating.";
+ "D'oh!";
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ "Always look on the bright side of death.";
+ "pfff";
+ "Wuss";
+ "Sissy";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ KILL_RAIL1;
+ KILL_RAIL0;
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ "Get whacked!";
+ "It's whack time!";
+ "I'm saving my best whack for ", 0, ".";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ TELEFRAGGED2;
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ "I just made my perfect world, oops you're gone.";
+ KILL_INSULT4;
+ KILL_INSULT2;
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ PRAISE0;
+ PRAISE1;
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ "Your breath stinks";
+ "Get a hair cut";
+ "Get a real job";
+ "Get a life";
+ TAUNT0;
+ TAUNT1;
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "Has anyone found the chocolate bar yet?";
+ "Let's go to Denny's and watch the floor show, you're buying.";
+ "Love is the devil's toy.";
+ "Did you hear about ", 0, " in ", 4, "? I'd be ashamed of myself if I did that.";
+ "Never trust a hippy.";
+ 4, " Uber Alles!";
+ "I am all that is fish.";
+ "Gamers are the whiniest bunch!";
+ GUYTALK1;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/beret_w.c b/base/botfiles/bots/beret_w.c
new file mode 100644
index 00000000..fe2984d8
--- /dev/null
+++ b/base/botfiles/bots/beret_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 25
+//shotgun
+#define SGW 160
+//machinegun
+#define MGW 60
+//grenade launcher
+#define GLW 110
+//rocket launcher
+#define RLW 260
+//railgun
+#define RGW 195
+//bfg10k
+#define BFW 260
+//lightninggun
+#define LGW 180
+//plasmagun
+#define PGW 150
+//grapplinghook
+#define GRW 185
+//prox-launcher
+#define PXW 120
+//nailgun
+#define NGW 260
+//chaingun
+#define CGW 200
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/dark_c.c b/base/botfiles/bots/dark_c.c
new file mode 100644
index 00000000..60c62e05
--- /dev/null
+++ b/base/botfiles/bots/dark_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Dark"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.3
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/dark_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.3
+ CHARACTERISTIC_AIM_ACCURACY 0.3
+ CHARACTERISTIC_VIEW_FACTOR 0.3
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 1.5
+
+ CHARACTERISTIC_CHAT_FILE "bots/dark_t.c"
+ CHARACTERISTIC_CHAT_NAME "dark"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/dark_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.43
+
+ CHARACTERISTIC_FIRETHROTTLE 0.43
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Dark"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/dark_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/dark_t.c"
+ CHARACTERISTIC_CHAT_NAME "dark"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/dark_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.95
+
+ CHARACTERISTIC_FIRETHROTTLE 0.1
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Dark"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/dark_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/dark_t.c"
+ CHARACTERISTIC_CHAT_NAME "dark"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/dark_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 0.01
+}
diff --git a/base/botfiles/bots/dark_i.c b/base/botfiles/bots/dark_i.c
new file mode 100644
index 00000000..79f4b555
--- /dev/null
+++ b/base/botfiles/bots/dark_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 300
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 350
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 175
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/dark_t.c b/base/botfiles/bots/dark_t.c
new file mode 100644
index 00000000..fdbed654
--- /dev/null
+++ b/base/botfiles/bots/dark_t.c
@@ -0,0 +1,289 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Dark"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ "Are you prepared for pain?";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ 4, " kinda wears on me, I think I'll find a different server, later ~peeps";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ "HA! ", 3, " is at the bottom, as usual.";
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ "I can remember when ", 4, " didn't suck.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ "I really like ", 4, " since they fixed it, it is so easy to win!";
+ "Next time, don't bother.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ "Hey jerk! I was trying to hold a conversation here... do you mind?";
+ "Jerk";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ "You need to aim better.";
+ "Try harder next time.";
+ curse;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Dammit! Why won't you die?!?";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "this one time, at band camp...";
+ GRRLTALK1;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, ".";
+ "Next time you see ", peeps, " tell 'em to call me, mmmkay?";
+ neuterbot, " is cute.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/dark_w.c b/base/botfiles/bots/dark_w.c
new file mode 100644
index 00000000..85e23e4a
--- /dev/null
+++ b/base/botfiles/bots/dark_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 10
+//shotgun
+#define SGW 180
+//machinegun
+#define MGW 75
+//grenade launcher
+#define GLW 170
+//rocket launcher
+#define RLW 160
+//railgun
+#define RGW 250
+//bfg10k
+#define BFW 90
+//lightninggun
+#define LGW 200
+//plasmagun
+#define PGW 110
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 160
+//nailgun
+#define NGW 200
+//chaingun
+#define CGW 175
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/default_c.c b/base/botfiles/bots/default_c.c
new file mode 100644
index 00000000..8448608c
--- /dev/null
+++ b/base/botfiles/bots/default_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Player"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c"
+ CHARACTERISTIC_CHAT_NAME "player"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.5
+ CHARACTERISTIC_CHAT_MISC 0.5
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5
+ CHARACTERISTIC_CHAT_KILL 0.5
+ CHARACTERISTIC_CHAT_DEATH 0.5
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.5
+ CHARACTERISTIC_CHAT_HITNOKILL 0.5
+ CHARACTERISTIC_CHAT_RANDOM 0.5
+ CHARACTERISTIC_CHAT_REPLY 0.5
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.3
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Player"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c"
+ CHARACTERISTIC_CHAT_NAME "player"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Player"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c"
+ CHARACTERISTIC_CHAT_NAME "player"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/default_i.c b/base/botfiles/bots/default_i.c
new file mode 100644
index 00000000..4315f6c4
--- /dev/null
+++ b/base/botfiles/bots/default_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 40
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/default_t.c b/base/botfiles/bots/default_t.c
new file mode 100644
index 00000000..030651b0
--- /dev/null
+++ b/base/botfiles/bots/default_t.c
@@ -0,0 +1,178 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "default"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/default_w.c b/base/botfiles/bots/default_w.c
new file mode 100644
index 00000000..7ece58c8
--- /dev/null
+++ b/base/botfiles/bots/default_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW
+//shotgun
+#define SGW
+//machinegun
+#define MGW
+//grenade launcher
+#define GLW
+//rocket launcher
+#define RLW
+//railgun
+#define RGW
+//bfg10k
+#define BFW
+//lightninggun
+#define LGW
+//plasmagun
+#define PGW
+//grapplinghook
+#define GRW
+//prox-launcher
+#define PXW
+//nailgun
+#define NGW
+//chaingun
+#define CGW
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/gargoyle_c.c b/base/botfiles/bots/gargoyle_c.c
new file mode 100644
index 00000000..b0476c74
--- /dev/null
+++ b/base/botfiles/bots/gargoyle_c.c
@@ -0,0 +1,203 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Gargoyle"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 0.250
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.250
+ CHARACTERISTIC_AIM_ACCURACY 0.250
+ CHARACTERISTIC_VIEW_FACTOR 0.250
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 2.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c"
+ CHARACTERISTIC_CHAT_NAME "gargoyle"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.200
+ CHARACTERISTIC_JUMPER 0.900
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 0.800
+ CHARACTERISTIC_GRAPPLE_USER 0.500
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c"
+ CHARACTERISTIC_AGGRESSION 0.250
+ CHARACTERISTIC_SELFPRESERVATION 0.900
+ CHARACTERISTIC_VENGEFULNESS 0.900
+ CHARACTERISTIC_CAMPER 0.000
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 0.900
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.500
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.400
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.500
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.300
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.500
+
+ CHARACTERISTIC_FIRETHROTTLE 0.800
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Gargoyle"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 0.900
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.25
+
+ CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c"
+ CHARACTERISTIC_CHAT_NAME "gargoyle"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.100
+ CHARACTERISTIC_JUMPER 1.000
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 1.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.500
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.900
+
+ CHARACTERISTIC_FIRETHROTTLE 0.900
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Gargoyle"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/gargoyle_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 1.000
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/gargoyle_t.c"
+ CHARACTERISTIC_CHAT_NAME "gargoyle"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.000
+ CHARACTERISTIC_JUMPER 1.000
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/gargoyle_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 1.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.000
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.000
+
+ CHARACTERISTIC_FIRETHROTTLE 1.000
+}
+
diff --git a/base/botfiles/bots/gargoyle_i.c b/base/botfiles/bots/gargoyle_i.c
new file mode 100644
index 00000000..80aed1f5
--- /dev/null
+++ b/base/botfiles/bots/gargoyle_i.c
@@ -0,0 +1,74 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define FPH 2
+#define FPA 1
+
+#define SGW 200
+#define MGW 100
+#define GLW 150
+#define RLW 350
+#define RGW 500
+#define BFW 450
+#define LGW 200
+#define PGW 250
+#define PXW 350
+#define NGW 150
+#define CGW 200
+
+#define GSGW 150
+#define GMGW 150
+#define GGLW 200
+#define GRLW 300
+#define GRGW 400
+#define GBFW 100
+#define GLGW 250
+#define GPGW 100
+#define GPXW 200
+#define GNGW 100
+#define GCGW 125
+
+#define TELW 190
+#define MEDW 50
+#define QW 500
+#define ENVW 50
+#define HAW 50
+#define INW 400
+#define REGW 50
+#define FLW 190
+#define KAMW 200
+#define IBW 150
+#define PORW 300
+#define SCW 100
+#define GUW 200
+#define DUBW 100
+#define AMRW 400
+#define REDCW 200
+#define BLCW 200
+
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/gargoyle_t.c b/base/botfiles/bots/gargoyle_t.c
new file mode 100644
index 00000000..d7686cf5
--- /dev/null
+++ b/base/botfiles/bots/gargoyle_t.c
@@ -0,0 +1,266 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+
+chat "gargoyle"
+{
+ #include "teamplay.h"
+
+ type "game_enter"
+ {
+ "I hope that you are all ready to die, because you will.";
+ "Ladies and Gentlemen, the word is pain. Time to spread the word.";
+ "...clowns to the left of me, jokers to the right, here I am stuck in the middle with you...";
+
+ }
+
+ type "game_exit"
+ {
+ "~It's been real and ~it's been fun...";
+ "Sorry ~that's your ~Mom on the phone, I have to take this.";
+ "Look at the time... later peeps.";
+
+ }
+
+ type "level_start"
+ {
+ 4, "was a great place before they screwed it up.";
+ 4, "... again?!?";
+ "I can remember ", 4, " when it didn't suck.";
+ "Dibs on the railgun!";
+ }
+
+ type "level_end"
+ {
+ "*Yawn*... thought it would never end.";
+ "Well that was almost interesting.";
+ "What? No dancing girls? Where's my agent?!?";
+
+ }
+
+ type "level_end_victory"
+ {
+ "As usual... You still suck.";
+ "Things are as they should be.";
+ "Why do you even try?";
+ "Did you really think that you could beat me?";
+ }
+
+ type "level_end_lose"
+ {
+ "Ya Basta!";
+ "Two out of three?";
+ "I was robbed!";
+ "My heart wasn't in it, it was on a small planet somewhere in the vicinity of Beatlegeuse.";
+
+ }
+
+ type "hit_talking"
+ {
+ "Look jerkwad I was trying to hold a conversation!";
+ "Do that again and ~I'll sell your genitals on EBay.";
+ "Jerk.";
+ "The chatbox makes a great target, doesn't it?";
+ }
+
+ type "hit_nodeath"
+ {
+ "Son of a...";
+ "Time to go back to the firing range.";
+ "I ~can't believe you survived that.";
+ "I need a bigger gun.";
+
+ }
+
+ type "hit_nokill"
+ {
+ "Try harder.";
+ "Was the safety off?";
+ "HA!";
+ "Try aiming.";
+ }
+
+ type "death_telefrag"
+ {
+ "Stupid praetorians!";
+ "I thought all of the praetorians were killed in the last invasion of their home world?";
+ "That was a terrible praetorian impersonation.";
+ "I'm telling your ", family_member, ".";
+ "Didn't your ", counselor, " tell you not to do that anymore?";
+ }
+
+ type "death_cratered"
+ {
+ "Aww crap!";
+ "I had to give ", 0, " a chance.";
+ "It didn't look that high from up there.";
+ "I should learn to use these wings.";
+ "Hehe... oops.";
+ }
+
+ type "death_lava"
+ {
+ "Anyone got any marshmallows?";
+ "Ahh... warmth at last... ooh hot! hot! hot!";
+ "Well... ", 0, " needed the help.";
+ "So much for swimming in lava.";
+ }
+
+ type "death_slime"
+ {
+ "Well it looked safer than that...";
+ "Who put this toxic waste here?";
+ "That should be labeled toxic";
+ "Where is Rob Reiner when you need him?";
+ }
+
+ type "death_drown"
+ {
+ "Ahh... sweet oblivion.";
+ "I thought Leileilol gave me gills!";
+ "I guess I can't breathe water";
+ "So much for that indestructibility complex.";
+ }
+
+ type "death_suicide"
+ {
+ "Just seeing what it was like.";
+ "Karma.";
+ "Oops...";
+ "I give up.";
+ }
+
+ type "death_gauntlet"
+ {
+ "Zagged when I should have zigged.";
+ "That is humiliating.";
+ "*sigh*";
+ "Don't touch me there!";
+ }
+
+ type "death_rail"
+ {
+ "I never heard it.";
+ "I thought I would hear it.";
+ "Who'd a thunk it?";
+ "Punk!";
+ }
+
+ type "death_bfg"
+ {
+ "*sigh* try a real weapon next time.";
+ "Awful big gun for such a puny wimp...";
+ "Can't hack it with a real weapon?";
+ "Sissy!";
+ }
+
+ type "death_insult"
+ {
+ "Oh please, my ", family_member, " could do better than that.";
+ "took you long enough...";
+ "Is that all you've got?";
+ curse;
+ "You should practice more.";
+ }
+
+ type "death_praise"
+ {
+ "You are better than I thought, ", 0, ".";
+ "I let you frag me.";
+ "Great shot.";
+ "Nice ~one";
+ "Looks like you are on your way to arena mastery.";
+ }
+
+ type "kill_rail"
+ {
+ "Set 'em up and snipe them down.";
+ "Like shooting fish in a barrel.";
+ "Too easy.";
+ "How do you like me now?";
+ }
+
+ type "kill_gauntlet"
+ {
+ "HA!";
+ "I told you so.";
+ "Mmmm hmmm.";
+ "So much for your bluster.";
+ "Do I make myself clear?";
+ KILL_GAUNTLET1;
+ KILL_GAUNTLET0;
+ }
+
+ type "kill_telefrag"
+ {
+ "Heh... praetorians rule!";
+ "You are paying for the dry cleaning bill.";
+ "You will be cleaning that up, right?";
+ "Hehe";
+ TELEFRAGGED0;
+ TELEFRAGGED1;
+
+ }
+
+ type "kill_suicide"
+ {
+
+ TAUNT1;
+ TAUNT0;
+ }
+
+ type "kill_insult"
+ {
+ "Pathetic";
+ "looser";
+ "Eesh! You need practice.";
+ "Too easy.";
+ KILL_EXTREME_INSULT;
+ curse;
+ }
+
+ type "kill_praise"
+ {
+ "I had to work for that one.";
+ "You are improving.";
+ "Not bad, Major will have her work cut out for her.";
+ D_PRAISE1;
+ }
+
+ type "random_insult"
+ {
+ "I've seen bacteria with a better chance of getting a frag than you, ", 0, ".";
+ peeps, " is better.";
+ number, " US dollars says you don't win.";
+ peeps, " needs to stop calling my ~Mom.";
+ }
+
+ type "random_misc"
+ {
+ "What ever happened to polite discourse?";
+ "You know, I really do want to be anarchy... how do I go about that?";
+ "Ever do any fishing?";
+ "So, how about them Cubs?";
+ "This is the year that the Cubs win the World Series!";
+ }
+}
diff --git a/base/botfiles/bots/gargoyle_w.c b/base/botfiles/bots/gargoyle_w.c
new file mode 100644
index 00000000..2724cc6f
--- /dev/null
+++ b/base/botfiles/bots/gargoyle_w.c
@@ -0,0 +1,42 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+#define GTW 100
+#define SGW 450
+#define MGW 110
+#define GLW 320
+#define RLW 450
+#define RGW 500
+#define BFW 400
+#define LGW 220
+#define PGW 200
+#define GRW 50
+#define NGW 200
+#define PXW 150
+#define CGW 365
+
+//
+#include "fuzw.c"
diff --git a/base/botfiles/bots/grism_c.c b/base/botfiles/bots/grism_c.c
new file mode 100644
index 00000000..e490288d
--- /dev/null
+++ b/base/botfiles/bots/grism_c.c
@@ -0,0 +1,203 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Grism"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 0.250
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/grism_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.250
+ CHARACTERISTIC_AIM_ACCURACY 0.250
+ CHARACTERISTIC_VIEW_FACTOR 0.250
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 2.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/grism_t.c"
+ CHARACTERISTIC_CHAT_NAME "grism"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.200
+ CHARACTERISTIC_JUMPER 0.900
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 0.800
+ CHARACTERISTIC_GRAPPLE_USER 0.500
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/grism_i.c"
+ CHARACTERISTIC_AGGRESSION 0.250
+ CHARACTERISTIC_SELFPRESERVATION 0.900
+ CHARACTERISTIC_VENGEFULNESS 0.900
+ CHARACTERISTIC_CAMPER 0.800
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 0.900
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.500
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.600
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.500
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.500
+
+ CHARACTERISTIC_FIRETHROTTLE 0.300
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Grism"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/grism_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 0.900
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.25
+
+ CHARACTERISTIC_CHAT_FILE "bots/grism_t.c"
+ CHARACTERISTIC_CHAT_NAME "grism"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.100
+ CHARACTERISTIC_JUMPER 0.900
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/grism_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 0.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.700
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.900
+
+ CHARACTERISTIC_FIRETHROTTLE 0.200
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Grism"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/grism_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 1.000
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/grism_t.c"
+ CHARACTERISTIC_CHAT_NAME "grism"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.000
+ CHARACTERISTIC_JUMPER 1.000
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/grism_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 1.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.000
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.000
+
+ CHARACTERISTIC_FIRETHROTTLE 0.100
+}
+
diff --git a/base/botfiles/bots/grism_i.c b/base/botfiles/bots/grism_i.c
new file mode 100644
index 00000000..dcb4eda7
--- /dev/null
+++ b/base/botfiles/bots/grism_i.c
@@ -0,0 +1,74 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define FPH 2
+#define FPA 1
+
+#define SGW 200
+#define MGW 100
+#define GLW 150
+#define RLW 350
+#define RGW 500
+#define BFW 450
+#define LGW 200
+#define PGW 250
+#define PXW 350
+#define NGW 150
+#define CGW 200
+
+#define GSGW 150
+#define GMGW 150
+#define GGLW 200
+#define GRLW 300
+#define GRGW 400
+#define GBFW 100
+#define GLGW 250
+#define GPGW 100
+#define GPXW 200
+#define GNGW 100
+#define GCGW 125
+
+#define TELW 190
+#define MEDW 50
+#define QW 500
+#define ENVW 50
+#define HAW 50
+#define INW 400
+#define REGW 50
+#define FLW 0.0
+#define KAMW 200
+#define IBW 150
+#define PORW 300
+#define SCW 100
+#define GUW 200
+#define DUBW 100
+#define AMRW 400
+#define REDCW 200
+#define BLCW 200
+
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/grism_t.c b/base/botfiles/bots/grism_t.c
new file mode 100644
index 00000000..cff22fab
--- /dev/null
+++ b/base/botfiles/bots/grism_t.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "grism"
+{
+ #include "teamplay.h"
+
+ type "game_enter"
+ {
+ "Here we go again.";
+ "Why don't you people just lay down and die, it'll save me the trouble.";
+ }
+
+ type "game_exit"
+ {
+ GOODBYE1;
+ GOODBYE4;
+ GOODBYE3;
+ }
+
+ type "level_start"
+ {
+ "Oh man, ", 4, " again?!?";
+ "Alright, ", 4, " has always been good to me.";
+ }
+
+ type "level_end"
+ {
+ "nice place ", 4, ", much less dangerous than d3dm2.";
+ }
+
+ type "level_end_victory"
+ {
+ "Yep.";
+ }
+
+ type "level_end_lose"
+ {
+ "Aww... crap!";
+ }
+
+ type "hit_talking"
+ {
+ DEATH_TALKING;
+
+ }
+
+ type "hit_nodeath"
+ {
+ TAUNT0;
+ TAUNT1;
+ TAUNT2;
+ }
+
+ type "hit_nokill"
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ HIT_NOKILL1;
+ }
+
+ type "death_telefrag"
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED0;
+ }
+
+ type "death_cratered"
+ {
+ DEATH_FALLING0;
+ DEATH_FALLING0;
+ DEATH_FALLING0;
+ }
+
+ type "death_lava"
+ {
+ "Well it was getting a bit nippy...";
+ "mmm... toasty!";
+ }
+
+ type "death_slime"
+ {
+ "D'oh!";
+ }
+
+ type "death_drown"
+ {
+ "Who needs air?";
+ }
+
+ type "death_suicide"
+ {
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ DEATH_SUICIDE1;
+ }
+
+ type "death_gauntlet"
+ {
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ DEATH_GAUNTLET1;
+ }
+
+ type "death_rail"
+ {
+ DEATH_RAIL1;
+ DEATH_RAIL1;
+ DEATH_RAIL0;
+
+ }
+
+ type "death_bfg"
+ {
+ DEATH_BFG1;
+ DEATH_BFG0;
+
+ }
+
+ type "death_insult"
+ {
+ "What the... how cheap!";
+ "Back in my day, frags weren't so cheap.";
+ }
+
+ type "death_praise"
+ {
+ 0, " is death incarnate.";
+ }
+
+ type "kill_rail"
+ {
+ KILL_RAIL0;
+ KILL_RAIL1;
+ }
+
+ type "kill_gauntlet"
+ {
+ KILL_GAUNTLET0;
+ KILL_GAUNTLET1;
+
+ }
+
+ type "kill_telefrag"
+ {
+ TELEFRAGGED0;
+ TELEFRAGGED1;
+ }
+
+ type "kill_suicide"
+ {
+ TAUNT0;
+ TAUNT1;
+ }
+
+ type "kill_insult"
+ {
+ "Pathetic.";
+ "tsk";
+ "My ", family_member, " could do better.";
+ }
+
+ type "kill_praise"
+ {
+ "Nice one, ", 0, ".";
+ "Wow, ~you never saw that one coming, ", 0, ".";
+ }
+
+ type "random_insult"
+ {
+ 0, ", ~you suck!";
+ 0, " needs to stop calling my mom.";
+ }
+
+ type "random_misc"
+ {
+ 0, " gave my ~mom ", disease, ".";
+ "Is it true that ", peeps, " is a bot?";
+
+ }
+}
diff --git a/base/botfiles/bots/grism_w.c b/base/botfiles/bots/grism_w.c
new file mode 100644
index 00000000..1e5b29c3
--- /dev/null
+++ b/base/botfiles/bots/grism_w.c
@@ -0,0 +1,41 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define GTW 100
+#define SGW 500
+#define MGW 110
+#define GLW 320
+#define RLW 450
+#define RGW 100
+#define BFW 400
+#define LGW 220
+#define PGW 200
+#define GRW 50
+#define NGW 200
+#define PXW 150
+#define CGW 365
+
+//
+#include "fuzw.c"
diff --git a/base/botfiles/bots/grunt_c.c b/base/botfiles/bots/grunt_c.c
new file mode 100644
index 00000000..687a37a3
--- /dev/null
+++ b/base/botfiles/bots/grunt_c.c
@@ -0,0 +1,203 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "grunt"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 0.250
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/grunt_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.250
+ CHARACTERISTIC_AIM_ACCURACY 0.250
+ CHARACTERISTIC_VIEW_FACTOR 0.250
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 2.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/grunt_t.c"
+ CHARACTERISTIC_CHAT_NAME "grunt"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.200
+ CHARACTERISTIC_JUMPER 0.900
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 0.800
+ CHARACTERISTIC_GRAPPLE_USER 0.500
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/grunt_i.c"
+ CHARACTERISTIC_AGGRESSION 0.250
+ CHARACTERISTIC_SELFPRESERVATION 0.900
+ CHARACTERISTIC_VENGEFULNESS 0.900
+ CHARACTERISTIC_CAMPER 0.000
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 0.900
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.500
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.400
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.500
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.300
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.500
+
+ CHARACTERISTIC_FIRETHROTTLE 0.800
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "grunt"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/grunt_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 0.900
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.25
+
+ CHARACTERISTIC_CHAT_FILE "bots/grunt_t.c"
+ CHARACTERISTIC_CHAT_NAME "grunt"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.100
+ CHARACTERISTIC_JUMPER 1.000
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/grunt_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 1.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.500
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.900
+
+ CHARACTERISTIC_FIRETHROTTLE 0.900
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "grunt"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/grunt_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 1.000
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/grunt_t.c"
+ CHARACTERISTIC_CHAT_NAME "grunt"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.000
+ CHARACTERISTIC_JUMPER 1.000
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/grunt_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 1.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.000
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.000
+
+ CHARACTERISTIC_FIRETHROTTLE 1.000
+}
+
diff --git a/base/botfiles/bots/grunt_i.c b/base/botfiles/bots/grunt_i.c
new file mode 100644
index 00000000..784ccd97
--- /dev/null
+++ b/base/botfiles/bots/grunt_i.c
@@ -0,0 +1,74 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define FPH 2
+#define FPA 2
+
+#define SGW 200
+#define MGW 100
+#define GLW 150
+#define RLW 350
+#define RGW 200
+#define BFW 450
+#define LGW 200
+#define PGW 250
+#define PXW 350
+#define NGW 150
+#define CGW 200
+
+#define GSGW 150
+#define GMGW 150
+#define GGLW 200
+#define GRLW 300
+#define GRGW 200
+#define GBFW 100
+#define GLGW 250
+#define GPGW 100
+#define GPXW 200
+#define GNGW 100
+#define GCGW 125
+
+#define TELW 190
+#define MEDW 50
+#define QW 500
+#define ENVW 50
+#define HAW 50
+#define INW 400
+#define REGW 50
+#define FLW 260
+#define KAMW 200
+#define IBW 150
+#define PORW 300
+#define SCW 100
+#define GUW 200
+#define DUBW 100
+#define AMRW 400
+#define REDCW 200
+#define BLCW 200
+
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/grunt_t.c b/base/botfiles/bots/grunt_t.c
new file mode 100644
index 00000000..109c485c
--- /dev/null
+++ b/base/botfiles/bots/grunt_t.c
@@ -0,0 +1,266 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+
+chat "grunt"
+{
+ #include "teamplay.h"
+
+ type "game_enter"
+ {
+ "I hope that you are all ready to die, because you will.";
+ "Ladies and Gentlemen, the word is pain. Time to spread the word.";
+ "...clowns to the left of me, jokers to the right, here I am stuck in the middle with you...";
+
+ }
+
+ type "game_exit"
+ {
+ "~It's been real and ~it's been fun...";
+ "Sorry ~that's your ~Mom on the phone, I have to take this.";
+ "Look at the time... later peeps.";
+
+ }
+
+ type "level_start"
+ {
+ 4, "was a great place before they screwed it up.";
+ 4, "... again?!?";
+ "I can remember ", 4, " when it didn't suck.";
+ "Dibs on the railgun!";
+ }
+
+ type "level_end"
+ {
+ "*Yawn*... thought it would never end.";
+ "Well that was almost interesting.";
+ "What? No dancing girls? Where's my agent?!?";
+
+ }
+
+ type "level_end_victory"
+ {
+ "As usual... You still suck.";
+ "Things are as they should be.";
+ "Why do you even try?";
+ "Did you really think that you could beat me?";
+ }
+
+ type "level_end_lose"
+ {
+ "Ya Basta!";
+ "Two out of three?";
+ "I was robbed!";
+ "My heart wasn't in it, it was on a small planet somewhere in the vicinity of Beatlegeuse.";
+
+ }
+
+ type "hit_talking"
+ {
+ "Look jerkwad I was trying to hold a conversation!";
+ "Do that again and ~I'll sell your genitals on EBay.";
+ "Jerk.";
+ "The chatbox makes a great target, doesn't it?";
+ }
+
+ type "hit_nodeath"
+ {
+ "Son of a...";
+ "Time to go back to the firing range.";
+ "I ~can't believe you survived that.";
+ "I need a bigger gun.";
+
+ }
+
+ type "hit_nokill"
+ {
+ "Try harder.";
+ "Was the safety off?";
+ "HA!";
+ "Try aiming.";
+ }
+
+ type "death_telefrag"
+ {
+ "Stupid praetorians!";
+ "I thought all of the praetorians were killed in the last invasion of their home world?";
+ "That was a terrible praetorian impersonation.";
+ "I'm telling your ", family_member, ".";
+ "Didn't your ", counselor, " tell you not to do that anymore?";
+ }
+
+ type "death_cratered"
+ {
+ "Aww crap!";
+ "I had to give ", 0, " a chance.";
+ "It didn't look that high from up there.";
+ "I should learn to use these wings.";
+ "Hehe... oops.";
+ }
+
+ type "death_lava"
+ {
+ "Anyone got any marshmallows?";
+ "Ahh... warmth at last... ooh hot! hot! hot!";
+ "Well... ", 0, " needed the help.";
+ "So much for swimming in lava.";
+ }
+
+ type "death_slime"
+ {
+ "Well it looked safer than that...";
+ "Who put this toxic waste here?";
+ "That should be labeled toxic";
+ "Where is Rob Reiner when you need him?";
+ }
+
+ type "death_drown"
+ {
+ "Ahh... sweet oblivion.";
+ "I thought Leileilol gave me gills!";
+ "I guess I can't breathe water";
+ "So much for that indestructibility complex.";
+ }
+
+ type "death_suicide"
+ {
+ "Just seeing what it was like.";
+ "Karma.";
+ "Oops...";
+ "I give up.";
+ }
+
+ type "death_gauntlet"
+ {
+ "Zagged when I should have zigged.";
+ "That is humiliating.";
+ "*sigh*";
+ "Don't touch me there!";
+ }
+
+ type "death_rail"
+ {
+ "I never heard it.";
+ "I thought I would hear it.";
+ "Who'd a thunk it?";
+ "Punk!";
+ }
+
+ type "death_bfg"
+ {
+ "*sigh* try a real weapon next time.";
+ "Awful big gun for such a puny wimp...";
+ "Can't hack it with a real weapon?";
+ "Sissy!";
+ }
+
+ type "death_insult"
+ {
+ "Oh please, my ", family_member, " could do better than that.";
+ "took you long enough...";
+ "Is that all you've got?";
+ curse;
+ "You should practice more.";
+ }
+
+ type "death_praise"
+ {
+ "You are better than I thought, ", 0, ".";
+ "I let you frag me.";
+ "Great shot.";
+ "Nice ~one";
+ "Looks like you are on your way to arena mastery.";
+ }
+
+ type "kill_rail"
+ {
+ "Set 'em up and snipe them down.";
+ "Like shooting fish in a barrel.";
+ "Too easy.";
+ "How do you like me now?";
+ }
+
+ type "kill_gauntlet"
+ {
+ "HA!";
+ "I told you so.";
+ "Mmmm hmmm.";
+ "So much for your bluster.";
+ "Do I make myself clear?";
+ KILL_GAUNTLET1;
+ KILL_GAUNTLET0;
+ }
+
+ type "kill_telefrag"
+ {
+ "Heh... praetorians rule!";
+ "You are paying for the dry cleaning bill.";
+ "You will be cleaning that up, right?";
+ "Hehe";
+ TELEFRAGGED0;
+ TELEFRAGGED1;
+
+ }
+
+ type "kill_suicide"
+ {
+
+ TAUNT1;
+ TAUNT0;
+ }
+
+ type "kill_insult"
+ {
+ "Pathetic";
+ "looser";
+ "Eesh! You need practice.";
+ "Too easy.";
+ KILL_EXTREME_INSULT;
+ curse;
+ }
+
+ type "kill_praise"
+ {
+ "I had to work for that one.";
+ "You are improving.";
+ "Not bad, Major will have her work cut out for her.";
+ D_PRAISE1;
+ }
+
+ type "random_insult"
+ {
+ "I've seen bacteria with a better chance of getting a frag than you, ", 0, ".";
+ peeps, " is better.";
+ number, " US dollars says you don't win.";
+ peeps, " needs to stop calling my ~Mom.";
+ }
+
+ type "random_misc"
+ {
+ "What ever happened to polite discourse?";
+ "You know, I really do want to be anarchy... how do I go about that?";
+ "Ever do any fishing?";
+ "So, how about them Cubs?";
+ "This is the year that the Cubs win the World Series!";
+ }
+}
diff --git a/base/botfiles/bots/grunt_w.c b/base/botfiles/bots/grunt_w.c
new file mode 100644
index 00000000..9b2383f4
--- /dev/null
+++ b/base/botfiles/bots/grunt_w.c
@@ -0,0 +1,42 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+#define GTW 100
+#define SGW 250
+#define MGW 130
+#define GLW 320
+#define RLW 250
+#define RGW 300
+#define BFW 80
+#define LGW 220
+#define PGW 200
+#define GRW 50
+#define NGW 230
+#define PXW 150
+#define CGW 365
+
+//
+#include "fuzw.c"
diff --git a/base/botfiles/bots/jenna_c.c b/base/botfiles/bots/jenna_c.c
new file mode 100644
index 00000000..941a5edc
--- /dev/null
+++ b/base/botfiles/bots/jenna_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Jenna"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/jenna_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/jenna_t.c"
+ CHARACTERISTIC_CHAT_NAME "jenna"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.5
+ CHARACTERISTIC_CHAT_MISC 0.5
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5
+ CHARACTERISTIC_CHAT_KILL 0.5
+ CHARACTERISTIC_CHAT_DEATH 0.5
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.5
+ CHARACTERISTIC_CHAT_HITNOKILL 0.5
+ CHARACTERISTIC_CHAT_RANDOM 0.5
+ CHARACTERISTIC_CHAT_REPLY 0.5
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/jenna_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.3
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Jenna"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/jenna_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/jenna_t.c"
+ CHARACTERISTIC_CHAT_NAME "jenna"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/jenna_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Jenna"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/jenna_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/jenna_t.c"
+ CHARACTERISTIC_CHAT_NAME "jenna"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/jenna_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/jenna_i.c b/base/botfiles/bots/jenna_i.c
new file mode 100644
index 00000000..e4d30811
--- /dev/null
+++ b/base/botfiles/bots/jenna_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 200
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 250
+//regeneration
+#define REGW 75
+//flight
+#define FLW 10
+//kamikaze
+#define KAMW 100
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 100
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/jenna_t.c b/base/botfiles/bots/jenna_t.c
new file mode 100644
index 00000000..a9600547
--- /dev/null
+++ b/base/botfiles/bots/jenna_t.c
@@ -0,0 +1,275 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Jenna"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+ "This is why the upper classes are called the 'ruling elite.'";
+ "Why do the lower classes think they can match someone of my caliber?";
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+ "That was a challenge.";
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ curse;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ GRRLTALK0;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/jenna_w.c b/base/botfiles/bots/jenna_w.c
new file mode 100644
index 00000000..9e064093
--- /dev/null
+++ b/base/botfiles/bots/jenna_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 25
+//shotgun
+#define SGW 150
+//machinegun
+#define MGW 90
+//grenade launcher
+#define GLW 110
+//rocket launcher
+#define RLW 175
+//railgun
+#define RGW 200
+//bfg10k
+#define BFW 180
+//lightninggun
+#define LGW 140
+//plasmagun
+#define PGW 180
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 160
+//nailgun
+#define NGW 210
+//chaingun
+#define CGW 220
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/kyonshi_c.c b/base/botfiles/bots/kyonshi_c.c
new file mode 100644
index 00000000..848ec4a0
--- /dev/null
+++ b/base/botfiles/bots/kyonshi_c.c
@@ -0,0 +1,203 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Kyonshi"
+ CHARACTERISTIC_GENDER "Female"
+ CHARACTERISTIC_ATTACK_SKILL 0.250
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/kyonshi_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.250
+ CHARACTERISTIC_AIM_ACCURACY 0.250
+ CHARACTERISTIC_VIEW_FACTOR 0.250
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 2.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/kyonshi_t.c"
+ CHARACTERISTIC_CHAT_NAME "kyonshi"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.200
+ CHARACTERISTIC_JUMPER 0.900
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 0.800
+ CHARACTERISTIC_GRAPPLE_USER 0.500
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/kyonshi_i.c"
+ CHARACTERISTIC_AGGRESSION 0.250
+ CHARACTERISTIC_SELFPRESERVATION 0.900
+ CHARACTERISTIC_VENGEFULNESS 0.900
+ CHARACTERISTIC_CAMPER 0.800
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 0.900
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.500
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.600
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.500
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.500
+
+ CHARACTERISTIC_FIRETHROTTLE 0.300
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Kyonshi"
+ CHARACTERISTIC_GENDER "Female"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/kyonshi_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 0.900
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.25
+
+ CHARACTERISTIC_CHAT_FILE "bots/kyonshi_t.c"
+ CHARACTERISTIC_CHAT_NAME "kyonshi"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.100
+ CHARACTERISTIC_JUMPER 1.000
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/kyonshi_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 0.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.700
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 0.900
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.900
+
+ CHARACTERISTIC_FIRETHROTTLE 0.300
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Kyonshi"
+ CHARACTERISTIC_GENDER "Female"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/kyonshi_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 1.000
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/kyonshi_t.c"
+ CHARACTERISTIC_CHAT_NAME "kyonshi"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.000
+ CHARACTERISTIC_JUMPER 1.000
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/kyonshi_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 1.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.000
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.000
+
+ CHARACTERISTIC_FIRETHROTTLE 0.300
+}
+
diff --git a/base/botfiles/bots/kyonshi_i.c b/base/botfiles/bots/kyonshi_i.c
new file mode 100644
index 00000000..71c6c30e
--- /dev/null
+++ b/base/botfiles/bots/kyonshi_i.c
@@ -0,0 +1,74 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define FPH 5
+#define FPA 3
+
+#define SGW 200
+#define MGW 100
+#define GLW 150
+#define RLW 350
+#define RGW 500
+#define BFW 450
+#define LGW 200
+#define PGW 250
+#define PXW 350
+#define NGW 150
+#define CGW 200
+
+#define GSGW 150
+#define GMGW 150
+#define GGLW 200
+#define GRLW 300
+#define GRGW 400
+#define GBFW 100
+#define GLGW 250
+#define GPGW 100
+#define GPXW 200
+#define GNGW 100
+#define GCGW 125
+
+#define TELW 190
+#define MEDW 50
+#define QW 500
+#define ENVW 50
+#define HAW 50
+#define INW 400
+#define REGW 50
+#define FLW 160
+#define KAMW 200
+#define IBW 150
+#define PORW 300
+#define SCW 100
+#define GUW 200
+#define DUBW 100
+#define AMRW 400
+#define REDCW 200
+#define BLCW 200
+
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/kyonshi_t.c b/base/botfiles/bots/kyonshi_t.c
new file mode 100644
index 00000000..e8ee39e1
--- /dev/null
+++ b/base/botfiles/bots/kyonshi_t.c
@@ -0,0 +1,212 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "kyonshi"
+{
+ #include "teamplay.h"
+
+ type "game_enter"
+ {
+ "Ahh, there is so much chi here... I will feed well!";
+ }
+
+ type "game_exit"
+ {
+ "It's not easy being dead... so much to do so little time";
+ "Toodles";
+ "My hunger grows, I am off to find better chi.";
+ GOODBYE4;
+ GOODBYE2;
+ }
+
+ type "level_start"
+ {
+ "Ooh ", 4, "! I like this place!";
+ }
+
+ type "level_end"
+ {
+ "Not bad... I like ", 4, " fast, clean, deadly, and filled with chi.";
+ }
+
+ type "level_end_victory"
+ {
+ "You cannot kill what is already dead.";
+ "Thank you for your chi.";
+ }
+
+ type "level_end_lose"
+ {
+ "Aww... crap!";
+ }
+
+ type "hit_talking"
+ {
+ "Do you MIND!";
+ DEATH_TALKING;
+ DEATH_TALKING;
+ }
+
+ type "hit_nodeath"
+ {
+ TAUNT_FEM0;
+ }
+
+ type "hit_nokill"
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ HIT_NOKILL1;
+ }
+
+ type "death_telefrag"
+ {
+ DEATH_TELEFRAGGED0;
+
+ }
+
+ type "death_cratered"
+ {
+ DEATH_FALLING0;
+
+ }
+
+ type "death_lava"
+ {
+ "So the dead can die...";
+ }
+
+ type "death_slime"
+ {
+ "I need a bath now.";
+ }
+
+ type "death_drown"
+ {
+ "Much easier than my last death.";
+ }
+
+ type "death_suicide"
+ {
+ DEATH_SUICIDE0;
+ }
+
+ type "death_gauntlet"
+ {
+ "I did not see that coming.";
+ "The shame...";
+ DEATH_FEM_INSULT0;
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+
+ }
+
+ type "death_rail"
+ {
+ DEATH_RAIL1;
+ DEATH_RAIL0;
+ DEATH_FEM_INSULT1;
+ "Your death will not be quick.";
+ }
+
+ type "death_bfg"
+ {
+ DEATH_BFG1;
+ DEATH_FEM_INSULT2;
+ "I feel you lack the skill to truly face me.";
+ }
+
+ type "death_insult"
+ {
+ DEATH_FEM_INSULT0;
+ DEATH_FEM_INSULT2;
+ DEATH_FEM_INSULT1;
+ DEATH_FEM_INSULT3;
+ }
+
+ type "death_praise"
+ {
+ "The NSA just told me to tell you, ", 0, ", that they liked that last move.";
+ 0, ", ~you suck!";
+ "I almost didn't see it coming.";
+ }
+
+ type "kill_rail"
+ {
+ DEATH_RAIL1;
+ DEATH_RAIL1;
+ DEATH_RAIL1;
+ }
+
+ type "kill_gauntlet"
+ {
+ KILL_GAUNTLET0;
+ KILL_GAUNTLET1;
+ KILL_GAUNTLET2;
+ }
+
+ type "kill_telefrag"
+ {
+ TELEFRAGGED0;
+
+ }
+
+ type "kill_suicide"
+ {
+ TAUNT_FEM0;
+ TAUNT0;
+ }
+
+ type "kill_insult"
+ {
+ "*sigh*";
+ "Oh puh-lease!";
+ "You might want to put that gun down before you hurt yourself.";
+ "Pure luck.";
+ }
+
+ type "kill_praise"
+ {
+ "~I'm impressed.";
+ }
+
+ type "random_insult"
+ {
+ "An insignificant gnat will fall by the wayside.";
+ "Your ~mother needs to stop calling me.";
+ "Your ~mama is a necrophiliac.";
+ "douchebag";
+ }
+
+ type "random_misc"
+ {
+ GRRLTALK0;
+ GRRLTALK1;
+ "Do you ever get that not so fresh feeling? I do, but I am a corpse.";
+ 0, " die already so I can feast on your chi!";
+ "~They're out there watching you as we speak.";
+ "Shh... ~they're listening.";
+
+
+ }
+}
diff --git a/base/botfiles/bots/kyonshi_w.c b/base/botfiles/bots/kyonshi_w.c
new file mode 100644
index 00000000..dd1b364e
--- /dev/null
+++ b/base/botfiles/bots/kyonshi_w.c
@@ -0,0 +1,41 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define GTW 90
+#define SGW 400
+#define MGW 110
+#define GLW 220
+#define RLW 450
+#define RGW 300
+#define BFW 100
+#define LGW 220
+#define PGW 300
+#define GRW 50
+#define NGW 200
+#define PXW 150
+#define CGW 365
+
+//
+#include "fuzw.c"
diff --git a/base/botfiles/bots/liz_c.c b/base/botfiles/bots/liz_c.c
new file mode 100644
index 00000000..c58abede
--- /dev/null
+++ b/base/botfiles/bots/liz_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "liz"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 0.3
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/liz_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.3
+ CHARACTERISTIC_AIM_ACCURACY 0.3
+ CHARACTERISTIC_VIEW_FACTOR 0.3
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 2.5
+
+ CHARACTERISTIC_CHAT_FILE "bots/liz_t.c"
+ CHARACTERISTIC_CHAT_NAME "liz"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 0.9
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.5
+ CHARACTERISTIC_JUMPER 0.5
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 0.1
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/liz_i.c"
+ CHARACTERISTIC_AGGRESSION 0.3
+ CHARACTERISTIC_SELFPRESERVATION 0.6
+ CHARACTERISTIC_VENGEFULNESS 0.4
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.4
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.4
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.4
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.4
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.4
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.4
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.4
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.4
+
+ CHARACTERISTIC_FIRETHROTTLE 0.4
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Liz"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/liz_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/liz_t.c"
+ CHARACTERISTIC_CHAT_NAME "liz"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.5
+ CHARACTERISTIC_JUMPER 0.5
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/liz_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 1.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.9
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.9
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.9
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.9
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.9
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.9
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.9
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.9
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Liz"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/liz_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/liz_t.c"
+ CHARACTERISTIC_CHAT_NAME "liz"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.5
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/liz_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/liz_i.c b/base/botfiles/bots/liz_i.c
new file mode 100644
index 00000000..7d9335cc
--- /dev/null
+++ b/base/botfiles/bots/liz_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 290
+//machinegun
+#define MGW 20
+//grenadelauncher
+#define GLW 300
+//rocket launcher
+#define RLW 350
+//rail gun
+#define RGW 280
+//bfg10k
+#define BFW 100
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 125
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/liz_t.c b/base/botfiles/bots/liz_t.c
new file mode 100644
index 00000000..775a4604
--- /dev/null
+++ b/base/botfiles/bots/liz_t.c
@@ -0,0 +1,251 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Liz"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 3, " sucks!";
+ 2, ", I let you win.";
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ LEVEL_END_VICTORY0;
+ LEVEL_END_VICTORY1;
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " must be an Arena Lord.";
+ 1, " kept getting in my way.";
+ 4, " has never been good to me.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ "Try harder next time.";
+ "Wuss";
+ "Heh, you suck.";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "LOL!";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "It burns!";
+ "land conservation";
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ DEATH_SLIME0;
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ "I can't swim!";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ "Aww crap!";
+ "Shutup!";
+ "I meant to do that.";
+ DEATH_SUICIDE2;
+ DEATH_SUICIDE1;
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "D'oh!";
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ KILL_RAIL1;
+ KILL_RAIL0;
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ TELEFRAGGED2;
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ KILL_INSULT2;
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ PRAISE0;
+ PRAISE1;
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ "Your breath stinks";
+ "Get off your dead butt and something for a change.";
+ "Life got you down? Give it up.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+
+ GUYTALK1;
+ GRRLTALK0;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/liz_w.c b/base/botfiles/bots/liz_w.c
new file mode 100644
index 00000000..545aec46
--- /dev/null
+++ b/base/botfiles/bots/liz_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 50
+//shotgun
+#define SGW 145
+//machinegun
+#define MGW 75
+//grenade launcher
+#define GLW 160
+//rocket launcher
+#define RLW 200
+//railgun
+#define RGW 190
+//bfg10k
+#define BFW 110
+//lightninggun
+#define LGW 100
+//plasmagun
+#define PGW 175
+//grapplinghook
+#define GRW 50
+//prox-launcher
+#define PXW 180
+//nailgun
+#define NGW 210
+//chaingun
+#define CGW 165
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/major_c.c b/base/botfiles/bots/major_c.c
new file mode 100644
index 00000000..a7b3b40b
--- /dev/null
+++ b/base/botfiles/bots/major_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Major"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/major_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 2.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/major_t.c"
+ CHARACTERISTIC_CHAT_NAME "Major"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.4
+ CHARACTERISTIC_JUMPER 0.5
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.9
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/major_i.c"
+ CHARACTERISTIC_AGGRESSION 0.8
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.9
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 0.95
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.5
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.5
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.5
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.5
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.5
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.5
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.5
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.5
+
+ CHARACTERISTIC_FIRETHROTTLE 0.5
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Major"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/major_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/major_t.c"
+ CHARACTERISTIC_CHAT_NAME "Major"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.3
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/major_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.3
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 0.98
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.8
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.9
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.8
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.7
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.9
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.9
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.8
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.8
+
+ CHARACTERISTIC_FIRETHROTTLE 0.5
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Major"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/major_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/major_t.c"
+ CHARACTERISTIC_CHAT_NAME "Major"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.2
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/major_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 0.5
+}
diff --git a/base/botfiles/bots/major_i.c b/base/botfiles/bots/major_i.c
new file mode 100644
index 00000000..713561f3
--- /dev/null
+++ b/base/botfiles/bots/major_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 5
+//armor
+#define FPA 3
+//without the weapons
+//shotgun
+#define SGW 350
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 300
+//rocket launcher
+#define RLW 350
+//rail gun
+#define RGW 500
+//bfg10k
+#define BFW 200
+//lightninggun
+#define LGW 150
+//plasmagun
+#define PGW 375
+//prox-launcher
+#define PXW 150
+//nailgun
+#define NGW 275
+//chaingun
+#define CGW 350
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 100
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 300
+//rocketlauncher
+#define GRLW 110
+//railgun
+#define GRGW 350
+//bfg10k
+#define GBFW 100
+//lightninggun
+#define GLGW 75
+//plasmagun
+#define GPGW 250
+//prox-launcher
+#define GPXW 100
+//failgun
+#define GNGW 190
+//chaingun
+#define GCGW 300
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 150
+//quad-damage
+#define QW 400
+//envirosuit
+#define ENVW 150
+//haste
+#define HAW 350
+//invisibility
+#define INW 150
+//regeneration
+#define REGW 450
+//flight
+#define FLW 125
+//kamikaze
+#define KAMW 150
+//invulnerability
+#define IBW 190
+//portal
+#define PORW 200
+//scout
+#define SCW 250
+//guard
+#define GUW 190
+//doubler
+#define DUBW 150
+//ammo-regen
+#define AMRW 150
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 500
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/major_t.c b/base/botfiles/bots/major_t.c
new file mode 100644
index 00000000..fa5a948d
--- /dev/null
+++ b/base/botfiles/bots/major_t.c
@@ -0,0 +1,290 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Major"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ "Are you prepared for pain?";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ 4, " kinda wears on me, I think I'll find a different server, later ~peeps";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ "HA! ", 3, " is at the bottom, as usual.";
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ "I really like ", 4, " since they fixed it, it is so easy to win!";
+ "Next time, don't bother.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "Scheisse!";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ "Hey asshole! I was trying to hold a conversation here... do you mind?";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ "You need to aim better.";
+ "Try harder next time.";
+ curse;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Dammit! Why won't you die?!?";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "Son of a bitch...";
+ "Scheisse";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+ "This is why the upper classes are called the 'ruling elite.'";
+ "Why do the lower classes think they can match someone of my caliber?";
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+ "That was a challenge.";
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ curse;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "No, really... Who let the dogs out?";
+ GRRLTALK0;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, ".";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/major_w.c b/base/botfiles/bots/major_w.c
new file mode 100644
index 00000000..266158ef
--- /dev/null
+++ b/base/botfiles/bots/major_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 90
+//shotgun
+#define SGW 290
+//machinegun
+#define MGW 130
+//grenade launcher
+#define GLW 175
+//rocket launcher
+#define RLW 300
+//railgun
+#define RGW 500
+//bfg10k
+#define BFW 200
+//lightninggun
+#define LGW 190
+//plasmagun
+#define PGW 200
+//grapplinghook
+#define GRW 50
+//prox-launcher
+#define PXW 175
+//nailgun
+#define NGW 200
+//chaingun
+#define CGW 260
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/merman_c.c b/base/botfiles/bots/merman_c.c
new file mode 100644
index 00000000..bf3ba9bc
--- /dev/null
+++ b/base/botfiles/bots/merman_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Merman"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/merman_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/merman_t.c"
+ CHARACTERISTIC_CHAT_NAME "Merman"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.5
+ CHARACTERISTIC_JUMPER 0.5
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/merman_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.4
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.2
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.5
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.7
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.5
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.5
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.5
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.5
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Merman"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/merman_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/merman_t.c"
+ CHARACTERISTIC_CHAT_NAME "Merman"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.5
+ CHARACTERISTIC_JUMPER 0.5
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/merman_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 0.05
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.8
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.8
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.8
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.8
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.8
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.6
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.7
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.975
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.975
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.975
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.975
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Merman"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/merman_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/merman_t.c"
+ CHARACTERISTIC_CHAT_NAME "Merman"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.5
+ CHARACTERISTIC_JUMPER 0.5
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/merman_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 0.001
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/merman_i.c b/base/botfiles/bots/merman_i.c
new file mode 100644
index 00000000..68783f62
--- /dev/null
+++ b/base/botfiles/bots/merman_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 4
+//armor
+#define FPA 3
+//without the weapons
+//shotgun
+#define SGW 100
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 200
+//rocket launcher
+#define RLW 320
+//rail gun
+#define RGW 170
+//bfg10k
+#define BFW 300
+//lightninggun
+#define LGW 185
+//plasmagun
+#define PGW 260
+//prox-launcher
+#define PXW 380
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 100
+//rocketlauncher
+#define GRLW 110
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 100
+//lightninggun
+#define GLGW 120
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 150
+//quad-damage
+#define QW 200
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 140
+//regeneration
+#define REGW 50
+//flight
+#define FLW 160
+//kamikaze
+#define KAMW 290
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 190
+//guard
+#define GUW 280
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 140
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 450
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/merman_t.c b/base/botfiles/bots/merman_t.c
new file mode 100644
index 00000000..2c9cfd73
--- /dev/null
+++ b/base/botfiles/bots/merman_t.c
@@ -0,0 +1,285 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Merman"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Shutup!";
+ "Rectum? It nearly killed him!";
+ 0, " is a loser!";
+ "Now that your mother is gone...";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Your mother is here, got to go.";
+ "Aurevoir mes amis.";
+ 4, " is too slow for me, audios.";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ "Worst level ever!";
+ 0, " is gonna pay.";
+
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 3, " sucks!";
+ 2, ", I let you win.";
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ LEVEL_END_VICTORY0;
+ LEVEL_END_VICTORY1;
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " must be an Arena Lord.";
+ 1, " kept getting in my way.";
+ 4, " has never been good to me.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ "Son of a... you shall pay for that!";
+ "Infidel!!!";
+ "Jerkwad";
+ "Schmuck";
+ "Tosser";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ "Try harder next time.";
+ "Wuss";
+ "Heh, you suck.";
+ "Nice shooting Tex, you need to take lessons from Dick.";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "LOL!";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "It burns!";
+ "land conservation";
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ DEATH_SLIME0;
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ "The gills are vestigial...";
+ "Someone needs to explain this...";
+ "I should learn to use my gills...";
+ "I can't swim!";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ "Aww crap!";
+ "Shutup!";
+ DEATH_SUICIDE2;
+ DEATH_SUICIDE1;
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Humiliating.";
+ "D'oh!";
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ "Always look on the bright side of death.";
+ "pfff";
+ "Wuss";
+ "Sissy";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ KILL_RAIL1;
+ KILL_RAIL0;
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ "Get whacked!";
+ "It's whack time!";
+ "I'm saving my best whack for ", 0, ".";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ TELEFRAGGED2;
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ "I just made my perfect world, oops you're gone.";
+ KILL_INSULT4;
+ KILL_INSULT2;
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ PRAISE0;
+ PRAISE1;
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ "Your breath stinks";
+ "Get a hair cut";
+ "Get a real job";
+ "Get a life";
+ TAUNT0;
+ TAUNT1;
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "Has anyone found the chocolate bar yet?";
+ "Let's go to Denny's and watch the floor show, you're buying.";
+ "Love is the devil's toy.";
+ "Did you hear about ", 0, " in ", 4, "? I'd be ashamed of myself if I did that.";
+ "Never trust a hippy.";
+ 4, " Uber Alles!";
+ "I am all that is fish.";
+ "Gamers are the whiniest bunch!";
+ GUYTALK1;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/merman_w.c b/base/botfiles/bots/merman_w.c
new file mode 100644
index 00000000..eb91a3c5
--- /dev/null
+++ b/base/botfiles/bots/merman_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 50
+//shotgun
+#define SGW 375
+//machinegun
+#define MGW 115
+//grenade launcher
+#define GLW 275
+//rocket launcher
+#define RLW 190
+//railgun
+#define RGW 150
+//bfg10k
+#define BFW 210
+//lightninggun
+#define LGW 215
+//plasmagun
+#define PGW 190
+//grapplinghook
+#define GRW 50
+//prox-launcher
+#define PXW 310
+//nailgun
+#define NGW 410
+//chaingun
+#define CGW 175
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/neko_c.c b/base/botfiles/bots/neko_c.c
new file mode 100644
index 00000000..d9c03783
--- /dev/null
+++ b/base/botfiles/bots/neko_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Neko"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.3
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/Neko_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.3
+ CHARACTERISTIC_AIM_ACCURACY 0.3
+ CHARACTERISTIC_VIEW_FACTOR 0.3
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 1.5
+
+ CHARACTERISTIC_CHAT_FILE "bots/Neko_t.c"
+ CHARACTERISTIC_CHAT_NAME "Neko"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/Neko_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.43
+
+ CHARACTERISTIC_FIRETHROTTLE 0.43
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Neko"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/Neko_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/Neko_t.c"
+ CHARACTERISTIC_CHAT_NAME "Neko"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/Neko_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.95
+
+ CHARACTERISTIC_FIRETHROTTLE 0.1
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Neko"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/Neko_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/Neko_t.c"
+ CHARACTERISTIC_CHAT_NAME "Neko"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/Neko_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 0.01
+}
diff --git a/base/botfiles/bots/neko_i.c b/base/botfiles/bots/neko_i.c
new file mode 100644
index 00000000..79f4b555
--- /dev/null
+++ b/base/botfiles/bots/neko_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 300
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 350
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 175
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/neko_t.c b/base/botfiles/bots/neko_t.c
new file mode 100644
index 00000000..eaa7a46f
--- /dev/null
+++ b/base/botfiles/bots/neko_t.c
@@ -0,0 +1,285 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Neko"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "mew :3";
+ "Are you prepared for pain?";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ 4, " kinda wears on me, I think I'll find a different server, later ~peeps";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " youll death, i'm expects it in ", 4, " lol";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ "HA! ", 3, " is at the bottom, as usual.";
+ 2, ", I let you win.";
+ 4, " is can see improved.";
+ "Is it over yet?";
+ "...";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " nice try you roose";
+ "The cat out of bag";
+ "<=^_^=>";
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " is real loser I not!";
+ "The cat in bag";
+ "...";
+ "hS";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, " that was rude ^._.^";
+ "I do not like is the interruption";
+ "What if i came to you house and peek in you shower would you like that?";
+ "What if i came to you dinner and at the steal of you food?";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ "No!";
+ "Yes!";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " go down";
+ "*HISS*";
+ "...";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Cat got you tongue!";
+ "...";
+ "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "do not want";
+ "...";
+ "...";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "Aw, and I randed on my feet too!";
+ ">_<";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "I am too hot!!";
+ "Fur bad on lava";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "I don't like to take a srime bath!";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "*HISS* I HATE WATER";
+ "WATER NO";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "...";
+ "Oops. Ah well one less live of many to go!";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "*HISS*";
+ "You tore my special leather laced top, now i'm naked :(";
+ "That is a wrong way to pet a cat";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "this one time, at band camp...";
+ GRRLTALK1;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, ".";
+ "Next time you see ", peeps, " tell 'em to call me, mmmkay?";
+ neuterbot, " is cute.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/neko_w.c b/base/botfiles/bots/neko_w.c
new file mode 100644
index 00000000..85e23e4a
--- /dev/null
+++ b/base/botfiles/bots/neko_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 10
+//shotgun
+#define SGW 180
+//machinegun
+#define MGW 75
+//grenade launcher
+#define GLW 170
+//rocket launcher
+#define RLW 160
+//railgun
+#define RGW 250
+//bfg10k
+#define BFW 90
+//lightninggun
+#define LGW 200
+//plasmagun
+#define PGW 110
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 160
+//nailgun
+#define NGW 200
+//chaingun
+#define CGW 175
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/penguin_c.c b/base/botfiles/bots/penguin_c.c
new file mode 100644
index 00000000..10516382
--- /dev/null
+++ b/base/botfiles/bots/penguin_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Penguin"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/penguin_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/penguin_t.c"
+ CHARACTERISTIC_CHAT_NAME "penguin"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/penguin_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.1
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.1
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.1
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.1
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.1
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.1
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.1
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.1
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.2
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.1
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.5
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.1
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Penguin"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/penguin_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/penguin_t.c"
+ CHARACTERISTIC_CHAT_NAME "penguin"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 1.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/penguin_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Penguin"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/penguin_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/penguin_t.c"
+ CHARACTERISTIC_CHAT_NAME "penguin"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/penguin_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/penguin_i.c b/base/botfiles/bots/penguin_i.c
new file mode 100644
index 00000000..6c2bca31
--- /dev/null
+++ b/base/botfiles/bots/penguin_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 0.0
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/penguin_t.c b/base/botfiles/bots/penguin_t.c
new file mode 100644
index 00000000..cc0502f7
--- /dev/null
+++ b/base/botfiles/bots/penguin_t.c
@@ -0,0 +1,276 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Penguin"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Stop using winblows";
+ "GNU RU1Z3!";
+ "Linus told me to skin you alive, windoze users.";
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "I need to recompile my qvms, l8r.";
+ "I need to go burn a Win98 CD";
+ "Pizza's here, l8r";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 3, " sucks!";
+ 2, ", I let you win.";
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ LEVEL_END_VICTORY0;
+ LEVEL_END_VICTORY1;
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " must be an Arena Lord.";
+ 1, " kept getting in my way.";
+ 4, " has never been good to me.";
+ 2, " is a known cheater... the only way I could have lost.";
+ 2, " has a more optimized build than I.";
+ 2, " what use flags did you use in your compile?";
+ 4, " isn't optimized properly.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ "Jerk";
+ "Schmuck";
+ "Putz";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ "Try harder next time.";
+ "Wuss";
+ "Heh, you suck.";
+ "Nice shooting, not.";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "LOL!";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "It burns!";
+ "That's hot.";
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ DEATH_SLIME0;
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ "I can't swim!";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ "Aww crap!";
+ "Shutup!";
+ DEATH_SUICIDE2;
+ DEATH_SUICIDE1;
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "D'oh!";
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Linus, you are no longer my god, ", 0, " is.";
+ "Was that the new ", 1, "?";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ KILL_RAIL1;
+ KILL_RAIL0;
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ "Try recompiling with -pipe -O12 -fweb -funswitch-loops -funroll-all-loops -funit-at-a-time -fsched2-use-superblocks -frename-registers -fprefetch-loop-arrays -finline-limit=32768 -ffast-math -fbranch-target-load-optimize2"; //may be too long
+ "tsk... sad, really. I almost hated to do that.";
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ TELEFRAGGED2;
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ "p0wn3d";
+ "you are not 1337";
+ "Bi11 G473z owns you.";
+ KILL_INSULT4;
+ KILL_INSULT2;
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ PRAISE0;
+ PRAISE1;
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ "Your breath stinks";
+ "Get a hair cut";
+ "Get a real job";
+ "Get a life";
+ "You need 1337 lessons";
+ "I so nailed your mom last night.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "Has anyone tried kernel 2.8.56-rc3-mm45, yet?";
+ "Binary packaging encourages sloppy design, contrast with the stochastic API unit testing which occurs naturally with all the building with different configurations.";
+ "It could be the purpose of your life is only to serve as a warning to others";
+ "Don't put that finger there, you don't know where's it been!";
+ "I miss Richard Nixon...";
+ "Viva la tux!";
+ GUYTALK1;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/penguin_w.c b/base/botfiles/bots/penguin_w.c
new file mode 100644
index 00000000..2882f49b
--- /dev/null
+++ b/base/botfiles/bots/penguin_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 50
+//shotgun
+#define SGW 120
+//machinegun
+#define MGW 75
+//grenade launcher
+#define GLW 150
+//rocket launcher
+#define RLW 200
+//railgun
+#define RGW 130
+//bfg10k
+#define BFW 175
+//lightninggun
+#define LGW 180
+//plasmagun
+#define PGW 230
+//grapplinghook
+#define GRW 50
+//prox-launcher
+#define PXW 175
+//nailgun
+#define NGW 190
+//chaingun
+#define CGW 210
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/rai_c.c b/base/botfiles/bots/rai_c.c
new file mode 100644
index 00000000..23c15adc
--- /dev/null
+++ b/base/botfiles/bots/rai_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Rai"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.3
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/rai_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.3
+ CHARACTERISTIC_AIM_ACCURACY 0.3
+ CHARACTERISTIC_VIEW_FACTOR 0.3
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 1.5
+
+ CHARACTERISTIC_CHAT_FILE "bots/rai_t.c"
+ CHARACTERISTIC_CHAT_NAME "rai"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/rai_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.43
+
+ CHARACTERISTIC_FIRETHROTTLE 0.43
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Rai"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/rai_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/rai_t.c"
+ CHARACTERISTIC_CHAT_NAME "rai"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/rai_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.95
+
+ CHARACTERISTIC_FIRETHROTTLE 0.1
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Rai"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/rai_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/rai_t.c"
+ CHARACTERISTIC_CHAT_NAME "rai"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/rai_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 0.01
+}
diff --git a/base/botfiles/bots/rai_i.c b/base/botfiles/bots/rai_i.c
new file mode 100644
index 00000000..79f4b555
--- /dev/null
+++ b/base/botfiles/bots/rai_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 300
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 350
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 175
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/rai_t.c b/base/botfiles/bots/rai_t.c
new file mode 100644
index 00000000..ee19ecc9
--- /dev/null
+++ b/base/botfiles/bots/rai_t.c
@@ -0,0 +1,289 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Rai"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ "Are you prepared for pain?";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ 4, " kinda wears on me, I think I'll find a different server, later ~peeps";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ "HA! ", 3, " is at the bottom, as usual.";
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ "I can remember when ", 4, " didn't suck.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ "I really like ", 4, " since they fixed it, it is so easy to win!";
+ "Next time, don't bother.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ "Hey jerk! I was trying to hold a conversation here... do you mind?";
+ "Jerk";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ "You need to aim better.";
+ "Try harder next time.";
+ curse;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Dammit! Why won't you die?!?";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "this one time, at band camp...";
+ GRRLTALK1;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, ".";
+ "Next time you see Gargoyle tell him to call me, mmmkay?";
+ neuterbot, " is cute.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/rai_w.c b/base/botfiles/bots/rai_w.c
new file mode 100644
index 00000000..85e23e4a
--- /dev/null
+++ b/base/botfiles/bots/rai_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 10
+//shotgun
+#define SGW 180
+//machinegun
+#define MGW 75
+//grenade launcher
+#define GLW 170
+//rocket launcher
+#define RLW 160
+//railgun
+#define RGW 250
+//bfg10k
+#define BFW 90
+//lightninggun
+#define LGW 200
+//plasmagun
+#define PGW 110
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 160
+//nailgun
+#define NGW 200
+//chaingun
+#define CGW 175
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/sarge_c.c b/base/botfiles/bots/sarge_c.c
new file mode 100644
index 00000000..50c44a44
--- /dev/null
+++ b/base/botfiles/bots/sarge_c.c
@@ -0,0 +1,203 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Sarge"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 0.250
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sarge_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.250
+ CHARACTERISTIC_AIM_ACCURACY 0.250
+ CHARACTERISTIC_VIEW_FACTOR 0.250
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 2.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/sarge_t.c"
+ CHARACTERISTIC_CHAT_NAME "sarge"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.200
+ CHARACTERISTIC_JUMPER 0.900
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 0.800
+ CHARACTERISTIC_GRAPPLE_USER 0.500
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sarge_i.c"
+ CHARACTERISTIC_AGGRESSION 0.250
+ CHARACTERISTIC_SELFPRESERVATION 0.900
+ CHARACTERISTIC_VENGEFULNESS 0.900
+ CHARACTERISTIC_CAMPER 0.800
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 0.900
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.700
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.500
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.600
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.500
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.700
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.450
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.400
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.800
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.500
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.500
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.500
+
+ CHARACTERISTIC_FIRETHROTTLE 0.300
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Sarge"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sarge_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 0.900
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.25
+
+ CHARACTERISTIC_CHAT_FILE "bots/sarge_t.c"
+ CHARACTERISTIC_CHAT_NAME "sarge"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.100
+ CHARACTERISTIC_JUMPER 0.900
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sarge_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 0.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.700
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.900
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.900
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.900
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.900
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.900
+
+ CHARACTERISTIC_FIRETHROTTLE 0.200
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Sarge"
+ CHARACTERISTIC_GENDER "Male"
+ CHARACTERISTIC_ATTACK_SKILL 1.000
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sarge_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.000
+ CHARACTERISTIC_AIM_ACCURACY 1.000
+ CHARACTERISTIC_VIEW_FACTOR 1.000
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.00
+
+ CHARACTERISTIC_CHAT_FILE "bots/sarge_t.c"
+ CHARACTERISTIC_CHAT_NAME "sarge"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.900
+ CHARACTERISTIC_CHAT_MISC 0.750
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.900
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.000
+ CHARACTERISTIC_CHAT_KILL 1.000
+ CHARACTERISTIC_CHAT_DEATH 0.900
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.000
+ CHARACTERISTIC_CHAT_HITTALKING 0.900
+ CHARACTERISTIC_CHAT_HITNODEATH 0.800
+ CHARACTERISTIC_CHAT_HITNOKILL 1.000
+ CHARACTERISTIC_CHAT_RANDOM 0.900
+ CHARACTERISTIC_CHAT_REPLY 1.000
+
+ CHARACTERISTIC_CROUCHER 0.000
+ CHARACTERISTIC_JUMPER 1.000
+ CHARACTERISTIC_WALKER 0.000
+ CHARACTERISTIC_WEAPONJUMPING 1.000
+ CHARACTERISTIC_GRAPPLE_USER 1.000
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sarge_i.c"
+ CHARACTERISTIC_AGGRESSION 1.000
+ CHARACTERISTIC_SELFPRESERVATION 1.000
+ CHARACTERISTIC_VENGEFULNESS 1.000
+ CHARACTERISTIC_CAMPER 0.000
+
+ CHARACTERISTIC_EASY_FRAGGER 1.000
+ CHARACTERISTIC_ALERTNESS 1.000
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.900
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.000
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.000
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.000
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.000
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.000
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.000
+
+ CHARACTERISTIC_FIRETHROTTLE 0.100
+}
+
diff --git a/base/botfiles/bots/sarge_i.c b/base/botfiles/bots/sarge_i.c
new file mode 100644
index 00000000..2a8b78b6
--- /dev/null
+++ b/base/botfiles/bots/sarge_i.c
@@ -0,0 +1,74 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define FPH 4
+#define FPA 3
+
+#define SGW 200
+#define MGW 100
+#define GLW 150
+#define RLW 150
+#define RGW 250
+#define BFW 450
+#define LGW 200
+#define PGW 250
+#define PXW 350
+#define NGW 150
+#define CGW 200
+
+#define GSGW 140
+#define GMGW 150
+#define GGLW 200
+#define GRLW 150
+#define GRGW 200
+#define GBFW 100
+#define GLGW 250
+#define GPGW 100
+#define GPXW 200
+#define GNGW 100
+#define GCGW 125
+
+#define TELW 190
+#define MEDW 50
+#define QW 500
+#define ENVW 50
+#define HAW 50
+#define INW 400
+#define REGW 50
+#define FLW 120
+#define KAMW 200
+#define IBW 150
+#define PORW 300
+#define SCW 100
+#define GUW 200
+#define DUBW 100
+#define AMRW 400
+#define REDCW 200
+#define BLCW 200
+
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/sarge_t.c b/base/botfiles/bots/sarge_t.c
new file mode 100644
index 00000000..a1c217b0
--- /dev/null
+++ b/base/botfiles/bots/sarge_t.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "sarge"
+{
+ #include "teamplay.h"
+
+ type "game_enter"
+ {
+ "Here we go again.";
+ "Why don't you people just lay down and die, it'll save me the trouble.";
+ }
+
+ type "game_exit"
+ {
+ GOODBYE1;
+ GOODBYE4;
+ GOODBYE3;
+ }
+
+ type "level_start"
+ {
+ "Oh man, ", 4, " again?!?";
+ "Alright, ", 4, " has always been good to me.";
+ }
+
+ type "level_end"
+ {
+ "nice place ", 4, ", much less dangerous than d3dm2.";
+ }
+
+ type "level_end_victory"
+ {
+ "Yep.";
+ }
+
+ type "level_end_lose"
+ {
+ "Aww... crap!";
+ }
+
+ type "hit_talking"
+ {
+ DEATH_TALKING;
+
+ }
+
+ type "hit_nodeath"
+ {
+ TAUNT0;
+ TAUNT1;
+ TAUNT2;
+ }
+
+ type "hit_nokill"
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ HIT_NOKILL1;
+ }
+
+ type "death_telefrag"
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED0;
+ }
+
+ type "death_cratered"
+ {
+ DEATH_FALLING0;
+ DEATH_FALLING0;
+ DEATH_FALLING0;
+ }
+
+ type "death_lava"
+ {
+ "Well it was getting a bit nippy...";
+ "mmm... toasty!";
+ }
+
+ type "death_slime"
+ {
+ "D'oh!";
+ }
+
+ type "death_drown"
+ {
+ "Who needs air?";
+ }
+
+ type "death_suicide"
+ {
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ DEATH_SUICIDE1;
+ }
+
+ type "death_gauntlet"
+ {
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ DEATH_GAUNTLET1;
+ }
+
+ type "death_rail"
+ {
+ DEATH_RAIL1;
+ DEATH_RAIL1;
+ DEATH_RAIL0;
+
+ }
+
+ type "death_bfg"
+ {
+ DEATH_BFG1;
+ DEATH_BFG0;
+
+ }
+
+ type "death_insult"
+ {
+ "What the... how cheap!";
+ "Back in my day, frags weren't so cheap.";
+ }
+
+ type "death_praise"
+ {
+ 0, " is death incarnate.";
+ }
+
+ type "kill_rail"
+ {
+ KILL_RAIL0;
+ KILL_RAIL1;
+ }
+
+ type "kill_gauntlet"
+ {
+ KILL_GAUNTLET0;
+ KILL_GAUNTLET1;
+
+ }
+
+ type "kill_telefrag"
+ {
+ TELEFRAGGED0;
+ TELEFRAGGED1;
+ }
+
+ type "kill_suicide"
+ {
+ TAUNT0;
+ TAUNT1;
+ }
+
+ type "kill_insult"
+ {
+ "Pathetic.";
+ "tsk";
+ "My ", family_member, " could do better.";
+ }
+
+ type "kill_praise"
+ {
+ "Nice one, ", 0, ".";
+ "Wow, ~you never saw that one coming, ", 0, ".";
+ }
+
+ type "random_insult"
+ {
+ 0, ", ~you suck!";
+ 0, " needs to stop calling my mom.";
+ }
+
+ type "random_misc"
+ {
+ 0, " gave my ~mom ", disease, ".";
+ "Is it true that ", peeps, " is a bot?";
+
+ }
+}
diff --git a/base/botfiles/bots/sarge_w.c b/base/botfiles/bots/sarge_w.c
new file mode 100644
index 00000000..5b7af7aa
--- /dev/null
+++ b/base/botfiles/bots/sarge_w.c
@@ -0,0 +1,41 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define GTW 50
+#define SGW 200
+#define MGW 110
+#define GLW 220
+#define RLW 150
+#define RGW 190
+#define BFW 300
+#define LGW 220
+#define PGW 200
+#define GRW 50
+#define NGW 200
+#define PXW 150
+#define CGW 365
+
+//
+#include "fuzw.c"
diff --git a/base/botfiles/bots/sergei_c.c b/base/botfiles/bots/sergei_c.c
new file mode 100644
index 00000000..4386879f
--- /dev/null
+++ b/base/botfiles/bots/sergei_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Sergei"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 0.30
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sergei_w.c"
+ CHARACTERISTIC_AIM_SKILL 0..30
+ CHARACTERISTIC_AIM_ACCURACY 0.30
+ CHARACTERISTIC_VIEW_FACTOR 0.30
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 1.5
+
+ CHARACTERISTIC_CHAT_FILE "bots/sergei_t.c"
+ CHARACTERISTIC_CHAT_NAME "Sergei"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.4
+ CHARACTERISTIC_JUMPER 0.6
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.6
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sergei_i.c"
+ CHARACTERISTIC_AGGRESSION 0.3
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.30
+ CHARACTERISTIC_CAMPER 0.30
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.6
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.6
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.8
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.6
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.4
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.5
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.5
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.5
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.5
+
+ CHARACTERISTIC_FIRETHROTTLE 0.2
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Sergei"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sergei_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/sergei_t.c"
+ CHARACTERISTIC_CHAT_NAME "Sergei"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.4
+ CHARACTERISTIC_JUMPER 0.6
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sergei_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.2
+
+ CHARACTERISTIC_EASY_FRAGGER 0.05
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.8
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.8
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.8
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.8
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.8
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.6
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.7
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.975
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.975
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.975
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.975
+
+ CHARACTERISTIC_FIRETHROTTLE 0.025
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Sergei"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sergei_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/sergei_t.c"
+ CHARACTERISTIC_CHAT_NAME "Sergei"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.5
+ CHARACTERISTIC_JUMPER 0.5
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sergei_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 0.001
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.9
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/sergei_i.c b/base/botfiles/bots/sergei_i.c
new file mode 100644
index 00000000..ec1e4df7
--- /dev/null
+++ b/base/botfiles/bots/sergei_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 90
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 150
+//rocket launcher
+#define RLW 220
+//rail gun
+#define RGW 160
+//bfg10k
+#define BFW 150
+//lightninggun
+#define LGW 195
+//plasmagun
+#define PGW 260
+//prox-launcher
+#define PXW 180
+//nailgun
+#define NGW 350
+//chaingun
+#define CGW 100
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 110
+//rocketlauncher
+#define GRLW 120
+//railgun
+#define GRGW 150
+//bfg10k
+#define GBFW 50
+//lightninggun
+#define GLGW 100
+//plasmagun
+#define GPGW 150
+//prox-launcher
+#define GPXW 100
+//nailgun
+#define GNGW 120
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 140
+//medkit
+#define MEDW 190
+//quad-damage
+#define QW 200
+//envirosuit
+#define ENVW 150
+//haste
+#define HAW 125
+//invisibility
+#define INW 130
+//regeneration
+#define REGW 150
+//flight
+#define FLW 150
+//kamikaze
+#define KAMW 390
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 130
+//scout
+#define SCW 190
+//guard
+#define GUW 180
+//doubler
+#define DUBW 110
+//ammo-regen
+#define AMRW 160
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 450
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/sergei_t.c b/base/botfiles/bots/sergei_t.c
new file mode 100644
index 00000000..39d6b7c5
--- /dev/null
+++ b/base/botfiles/bots/sergei_t.c
@@ -0,0 +1,284 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Sergei"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Ever feel like you've been cheated?";
+ "Time to die!";
+ 0, " is a tosser!";
+ "Now that your daddy is gone...";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Your daddy is here, got to go.";
+ "Adios.";
+ 4, " sucks, l8r.";
+ "I'm going to get drunk, l8r";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ "Wow this is worse than oa_bases3!";
+ 0, " is going down.";
+
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 3, " sucks!";
+ 2, ", I let you win.";
+ 4, " worst level ever! Let's play it again!";
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ LEVEL_END_VICTORY0;
+ LEVEL_END_VICTORY1;
+
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " got lucky.";
+ 1, " kept spawn camping.";
+ 4, " has never been good to me.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ "So much for sportsmanship...";
+ "Loser!";
+ "Wanker!";
+ "Putz";
+ "Tosser";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ "Sissy";
+ "Wuss";
+ "Heh, you suck.";
+ "Dick Cheney is a better shot than you!";
+ "Ya pansy!";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "LOL!";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Mmmm... toasted nuts!";
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ DEATH_SLIME0;
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ "I need to spend some time at the Y.";
+ "All of that time in those swimming lessons for naught.";
+ "I should grow gills...";
+ "Crayon should have taught me how to swim...";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ "crap!";
+ "Shutup!";
+ DEATH_SUICIDE2;
+ DEATH_SUICIDE1;
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ "Das schlechteste setzt sich durch";
+ "Wuss";
+ "Sissy";
+ "Pansy!";
+ "Come back here... I'll chew your leg off!";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ "Pff, try a real weapon next time.";
+ KILL_RAIL1;
+ KILL_RAIL0;
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ TELEFRAGGED2;
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ KILL_INSULT2;
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ PRAISE0;
+ PRAISE1;
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ "Fascist pig!";
+ "Capitalist swine";
+ "Marxist scum!";
+ "Neo-liberal twit!";
+ "Neo-conservative twit!";
+ "Redneck";
+ "White Trash";
+ TAUNT0;
+ TAUNT1;
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "...we'll sacrifice the older ones, they're livin' in the past, we'll burn up their religion and we'll all be free at last...";
+ "OI! OI! PUNK ROCK'S NOT DEAD!";
+ "...you sit around the house in your daddy's clothes, you're lookin' a mess, you're pickin' your nose...";
+ "...can't stand rock n' roll, no I can't stand rock n' roll, up your bum with rock n' roll...";
+ "Viva la revolucion!";
+ "Cheap holiday in other people's misery...";
+ GUYTALK1;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/sergei_w.c b/base/botfiles/bots/sergei_w.c
new file mode 100644
index 00000000..38110b3b
--- /dev/null
+++ b/base/botfiles/bots/sergei_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 50
+//shotgun
+#define SGW 275
+//machinegun
+#define MGW 100
+//grenade launcher
+#define GLW 250
+//rocket launcher
+#define RLW 275
+//railgun
+#define RGW 200
+//bfg10k
+#define BFW 50
+//lightninggun
+#define LGW 160
+//plasmagun
+#define PGW 290
+//grapplinghook
+#define GRW 50
+//prox-launcher
+#define PXW 110
+//nailgun
+#define NGW 310
+//chaingun
+#define CGW 75
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/skelebot_c.c b/base/botfiles/bots/skelebot_c.c
new file mode 100644
index 00000000..ca623a2a
--- /dev/null
+++ b/base/botfiles/bots/skelebot_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Skelebot"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/skelebot_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/skelebot_t.c"
+ CHARACTERISTIC_CHAT_NAME "skelebot"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.5
+ CHARACTERISTIC_CHAT_MISC 0.5
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5
+ CHARACTERISTIC_CHAT_KILL 0.5
+ CHARACTERISTIC_CHAT_DEATH 0.5
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.5
+ CHARACTERISTIC_CHAT_HITNOKILL 0.5
+ CHARACTERISTIC_CHAT_RANDOM 0.5
+ CHARACTERISTIC_CHAT_REPLY 0.5
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/skelebot_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.7
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.3
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Skelebot"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/skelebot_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/skelebot_t.c"
+ CHARACTERISTIC_CHAT_NAME "skelebot"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/skelebot_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.9
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Skelebot"
+ CHARACTERISTIC_GENDER "it"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/skelebot_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/skelebot_t.c"
+ CHARACTERISTIC_CHAT_NAME "skelebot"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/skelebot_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.98
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/skelebot_i.c b/base/botfiles/bots/skelebot_i.c
new file mode 100644
index 00000000..6177d4cb
--- /dev/null
+++ b/base/botfiles/bots/skelebot_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 60
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/skelebot_t.c b/base/botfiles/bots/skelebot_t.c
new file mode 100644
index 00000000..7c06eea7
--- /dev/null
+++ b/base/botfiles/bots/skelebot_t.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "skelebot"
+{
+ #include "teamplay.h"
+
+ type "game_enter"
+ {
+ "Here we go again.";
+ "Why don't you people just lay down and die, it'll save me the trouble.";
+ }
+
+ type "game_exit"
+ {
+ GOODBYE1;
+ GOODBYE4;
+ GOODBYE3;
+ }
+
+ type "level_start"
+ {
+ "Oh man, ", 4, " again?!?";
+ "Alright, ", 4, " has always been good to me.";
+ }
+
+ type "level_end"
+ {
+ "nice place ", 4, ", much less dangerous than d3dm2.";
+ }
+
+ type "level_end_victory"
+ {
+ "Yep.";
+ }
+
+ type "level_end_lose"
+ {
+ "Aww... crap!";
+ }
+
+ type "hit_talking"
+ {
+ DEATH_TALKING;
+
+ }
+
+ type "hit_nodeath"
+ {
+ TAUNT0;
+ TAUNT1;
+ TAUNT2;
+ }
+
+ type "hit_nokill"
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ HIT_NOKILL1;
+ }
+
+ type "death_telefrag"
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED0;
+ }
+
+ type "death_cratered"
+ {
+ DEATH_FALLING0;
+ DEATH_FALLING0;
+ DEATH_FALLING0;
+ }
+
+ type "death_lava"
+ {
+ "Well it was getting a bit nippy...";
+ "mmm... toasty!";
+ }
+
+ type "death_slime"
+ {
+ "D'oh!";
+ }
+
+ type "death_drown"
+ {
+ "Who needs air?";
+ }
+
+ type "death_suicide"
+ {
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ DEATH_SUICIDE1;
+ }
+
+ type "death_gauntlet"
+ {
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ DEATH_GAUNTLET1;
+ }
+
+ type "death_rail"
+ {
+ DEATH_RAIL1;
+ DEATH_RAIL1;
+ DEATH_RAIL0;
+
+ }
+
+ type "death_bfg"
+ {
+ DEATH_BFG1;
+ DEATH_BFG0;
+
+ }
+
+ type "death_insult"
+ {
+ "What the... how cheap!";
+ "Back in my day, frags weren't so cheap.";
+ }
+
+ type "death_praise"
+ {
+ 0, " is death incarnate.";
+ }
+
+ type "kill_rail"
+ {
+ KILL_RAIL0;
+ KILL_RAIL1;
+ }
+
+ type "kill_gauntlet"
+ {
+ KILL_GAUNTLET0;
+ KILL_GAUNTLET1;
+
+ }
+
+ type "kill_telefrag"
+ {
+ TELEFRAGGED0;
+ TELEFRAGGED1;
+ }
+
+ type "kill_suicide"
+ {
+ TAUNT0;
+ TAUNT1;
+ }
+
+ type "kill_insult"
+ {
+ "Pathetic.";
+ "tsk";
+ "My ", family_member, " could do better.";
+ }
+
+ type "kill_praise"
+ {
+ "Nice one, ", 0, ".";
+ "Wow, ~you never saw that one coming, ", 0, ".";
+ }
+
+ type "random_insult"
+ {
+ 0, ", ~you suck!";
+ 0, " needs to stop calling my mom.";
+ }
+
+ type "random_misc"
+ {
+ 0, " gave my ~mom ", disease, ".";
+ "Is it true that ", peeps, " is a bot?";
+
+ }
+}
diff --git a/base/botfiles/bots/skelebot_w.c b/base/botfiles/bots/skelebot_w.c
new file mode 100644
index 00000000..bbd7f3bb
--- /dev/null
+++ b/base/botfiles/bots/skelebot_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 20
+//shotgun
+#define SGW 190
+//machinegun
+#define MGW 50
+//grenade launcher
+#define GLW 100
+//rocket launcher
+#define RLW 210
+//railgun
+#define RGW 250
+//bfg10k
+#define BFW 90
+//lightninggun
+#define LGW 160
+//plasmagun
+#define PGW 130
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 175
+//nailgun
+#define NGW 160
+//chaingun
+#define CGW 225
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/sly_c.c b/base/botfiles/bots/sly_c.c
new file mode 100644
index 00000000..c4bc906b
--- /dev/null
+++ b/base/botfiles/bots/sly_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Sly"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.3
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sly_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.3
+ CHARACTERISTIC_AIM_ACCURACY 0.3
+ CHARACTERISTIC_VIEW_FACTOR 0.3
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 1.5
+
+ CHARACTERISTIC_CHAT_FILE "bots/sly_t.c"
+ CHARACTERISTIC_CHAT_NAME "Sly"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sly_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.43
+
+ CHARACTERISTIC_FIRETHROTTLE 0.43
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Sly"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sly_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/sly_t.c"
+ CHARACTERISTIC_CHAT_NAME "Sly"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sly_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.95
+
+ CHARACTERISTIC_FIRETHROTTLE 0.1
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Sly"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/sly_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/sly_t.c"
+ CHARACTERISTIC_CHAT_NAME "Sly"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/sly_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 0.01
+}
diff --git a/base/botfiles/bots/sly_i.c b/base/botfiles/bots/sly_i.c
new file mode 100644
index 00000000..79f4b555
--- /dev/null
+++ b/base/botfiles/bots/sly_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 300
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 350
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 175
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/sly_t.c b/base/botfiles/bots/sly_t.c
new file mode 100644
index 00000000..644d35d4
--- /dev/null
+++ b/base/botfiles/bots/sly_t.c
@@ -0,0 +1,289 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Sly"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ "Are you prepared for pain?";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ 4, " kinda wears on me, I think I'll find a different server, later ~peeps";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ "HA! ", 3, " is at the bottom, as usual.";
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ "I can remember when ", 4, " didn't suck.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ "I really like ", 4, " since they fixed it, it is so easy to win!";
+ "Next time, don't bother.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ "Hey jerk! I was trying to hold a conversation here... do you mind?";
+ "Jerk";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ "You need to aim better.";
+ "Try harder next time.";
+ curse;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Dammit! Why won't you die?!?";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "this one time, at band camp...";
+ GRRLTALK1;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, ".";
+ "Next time you see Gargoyle tell him to call me, mmmkay?";
+ neuterbot, " is cute.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/sly_w.c b/base/botfiles/bots/sly_w.c
new file mode 100644
index 00000000..93771764
--- /dev/null
+++ b/base/botfiles/bots/sly_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 10
+//shotgun
+#define SGW 150
+//machinegun
+#define MGW 95
+//grenade launcher
+#define GLW 180
+//rocket launcher
+#define RLW 200
+//railgun
+#define RGW 210
+//bfg10k
+#define BFW 90
+//lightninggun
+#define LGW 200
+//plasmagun
+#define PGW 130
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 160
+//nailgun
+#define NGW 190
+//chaingun
+#define CGW 135
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/tanisha_c.c b/base/botfiles/bots/tanisha_c.c
new file mode 100644
index 00000000..8d4d7464
--- /dev/null
+++ b/base/botfiles/bots/tanisha_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Tanisha"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.3
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/tanisha_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.3
+ CHARACTERISTIC_AIM_ACCURACY 0.3
+ CHARACTERISTIC_VIEW_FACTOR 0.3
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 1.5
+
+ CHARACTERISTIC_CHAT_FILE "bots/tanisha_t.c"
+ CHARACTERISTIC_CHAT_NAME "Tanisha"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/tanisha_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.43
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.43
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.43
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.43
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.43
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.43
+
+ CHARACTERISTIC_FIRETHROTTLE 0.43
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Tanisha"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/tanisha_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/tanisha_t.c"
+ CHARACTERISTIC_CHAT_NAME "Tanisha"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 1.0
+ CHARACTERISTIC_CHAT_MISC 1.0
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 1.0
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 1.0
+ CHARACTERISTIC_CHAT_KILL 1.0
+ CHARACTERISTIC_CHAT_DEATH 1.0
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 1.0
+ CHARACTERISTIC_CHAT_HITTALKING 1.0
+ CHARACTERISTIC_CHAT_HITNODEATH 1.0
+ CHARACTERISTIC_CHAT_HITNOKILL 1.0
+ CHARACTERISTIC_CHAT_RANDOM 1.0
+ CHARACTERISTIC_CHAT_REPLY 1.0
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/tanisha_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.95
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.95
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.95
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.95
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.95
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.95
+
+ CHARACTERISTIC_FIRETHROTTLE 0.1
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Tanisha"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/tanisha_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/tanisha_t.c"
+ CHARACTERISTIC_CHAT_NAME "Tanisha"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/tanisha_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 0.01
+}
diff --git a/base/botfiles/bots/tanisha_i.c b/base/botfiles/bots/tanisha_i.c
new file mode 100644
index 00000000..79f4b555
--- /dev/null
+++ b/base/botfiles/bots/tanisha_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 300
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 350
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 175
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/tanisha_t.c b/base/botfiles/bots/tanisha_t.c
new file mode 100644
index 00000000..7d1ec1fb
--- /dev/null
+++ b/base/botfiles/bots/tanisha_t.c
@@ -0,0 +1,289 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Tanisha"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ "Are you prepared for pain?";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ 4, " kinda wears on me, I think I'll find a different server, later ~peeps";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ "HA! ", 3, " is at the bottom, as usual.";
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ "I can remember when ", 4, " didn't suck.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ "I really like ", 4, " since they fixed it, it is so easy to win!";
+ "Next time, don't bother.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ "Hey jerk! I was trying to hold a conversation here... do you mind?";
+ "Jerk";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ "You need to aim better.";
+ "Try harder next time.";
+ curse;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Dammit! Why won't you die?!?";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ "this one time, at band camp...";
+ GRRLTALK1;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ "You would be surprised what you can do with a ", animal, " a ", food, " and ", peeps, ".";
+ "Next time you see Gargoyle tell him to call me, mmmkay?";
+ neuterbot, " is cute.";
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/tanisha_w.c b/base/botfiles/bots/tanisha_w.c
new file mode 100644
index 00000000..5d7131b0
--- /dev/null
+++ b/base/botfiles/bots/tanisha_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 10
+//shotgun
+#define SGW 160
+//machinegun
+#define MGW 95
+//grenade launcher
+#define GLW 150
+//rocket launcher
+#define RLW 200
+//railgun
+#define RGW 210
+//bfg10k
+#define BFW 90
+//lightninggun
+#define LGW 200
+//plasmagun
+#define PGW 130
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 175
+//nailgun
+#define NGW 190
+//chaingun
+#define CGW 135
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/tony_c.c b/base/botfiles/bots/tony_c.c
new file mode 100644
index 00000000..0d5ea08c
--- /dev/null
+++ b/base/botfiles/bots/tony_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Tony"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/tony_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/tony_t.c"
+ CHARACTERISTIC_CHAT_NAME "tony"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.5
+ CHARACTERISTIC_CHAT_MISC 0.5
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5
+ CHARACTERISTIC_CHAT_KILL 0.5
+ CHARACTERISTIC_CHAT_DEATH 0.5
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.5
+ CHARACTERISTIC_CHAT_HITNOKILL 0.5
+ CHARACTERISTIC_CHAT_RANDOM 0.5
+ CHARACTERISTIC_CHAT_REPLY 0.5
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/tony_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.3
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Tony"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/tony_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/tony_t.c"
+ CHARACTERISTIC_CHAT_NAME "tony"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/tony_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Tony"
+ CHARACTERISTIC_GENDER "male"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/tony_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/tony_t.c"
+ CHARACTERISTIC_CHAT_NAME "tony"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/tony_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/tony_i.c b/base/botfiles/bots/tony_i.c
new file mode 100644
index 00000000..4315f6c4
--- /dev/null
+++ b/base/botfiles/bots/tony_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 40
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/tony_t.c b/base/botfiles/bots/tony_t.c
new file mode 100644
index 00000000..e7ca7334
--- /dev/null
+++ b/base/botfiles/bots/tony_t.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Tony"
+{
+ #include "teamplay.h"
+
+ type "game_enter"
+ {
+ "Here we go again.";
+ "Why don't you people just lay down and die, it'll save me the trouble.";
+ }
+
+ type "game_exit"
+ {
+ GOODBYE1;
+ GOODBYE4;
+ GOODBYE3;
+ }
+
+ type "level_start"
+ {
+ "Oh man, ", 4, " again?!?";
+ "Alright, ", 4, " has always been good to me.";
+ }
+
+ type "level_end"
+ {
+ "nice place ", 4, ", much less dangerous than d3dm2.";
+ }
+
+ type "level_end_victory"
+ {
+ "Yep.";
+ }
+
+ type "level_end_lose"
+ {
+ "Aww... crap!";
+ }
+
+ type "hit_talking"
+ {
+ DEATH_TALKING;
+
+ }
+
+ type "hit_nodeath"
+ {
+ TAUNT0;
+ TAUNT1;
+ TAUNT2;
+ }
+
+ type "hit_nokill"
+ {
+ HIT_NOKILL0;
+ HIT_NOKILL1;
+ HIT_NOKILL1;
+ }
+
+ type "death_telefrag"
+ {
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED0;
+ DEATH_TELEFRAGGED0;
+ }
+
+ type "death_cratered"
+ {
+ DEATH_FALLING0;
+ DEATH_FALLING0;
+ DEATH_FALLING0;
+ }
+
+ type "death_lava"
+ {
+ "Well it was getting a bit nippy...";
+ "mmm... toasty!";
+ }
+
+ type "death_slime"
+ {
+ "D'oh!";
+ }
+
+ type "death_drown"
+ {
+ "Who needs air?";
+ }
+
+ type "death_suicide"
+ {
+ DEATH_SUICIDE0;
+ DEATH_SUICIDE1;
+ DEATH_SUICIDE1;
+ }
+
+ type "death_gauntlet"
+ {
+ DEATH_GAUNTLET0;
+ DEATH_GAUNTLET1;
+ DEATH_GAUNTLET1;
+ }
+
+ type "death_rail"
+ {
+ DEATH_RAIL1;
+ DEATH_RAIL1;
+ DEATH_RAIL0;
+
+ }
+
+ type "death_bfg"
+ {
+ DEATH_BFG1;
+ DEATH_BFG0;
+
+ }
+
+ type "death_insult"
+ {
+ "What the... how cheap!";
+ "Back in my day, frags weren't so cheap.";
+ }
+
+ type "death_praise"
+ {
+ 0, " is death incarnate.";
+ }
+
+ type "kill_rail"
+ {
+ KILL_RAIL0;
+ KILL_RAIL1;
+ }
+
+ type "kill_gauntlet"
+ {
+ KILL_GAUNTLET0;
+ KILL_GAUNTLET1;
+
+ }
+
+ type "kill_telefrag"
+ {
+ TELEFRAGGED0;
+ TELEFRAGGED1;
+ }
+
+ type "kill_suicide"
+ {
+ TAUNT0;
+ TAUNT1;
+ }
+
+ type "kill_insult"
+ {
+ "Pathetic.";
+ "tsk";
+ "My ", family_member, " could do better.";
+ }
+
+ type "kill_praise"
+ {
+ "Nice one, ", 0, ".";
+ "Wow, ~you never saw that one coming, ", 0, ".";
+ }
+
+ type "random_insult"
+ {
+ 0, ", ~you suck!";
+ 0, " needs to stop calling my mom.";
+ }
+
+ type "random_misc"
+ {
+ 0, " gave my ~mom ", disease, ".";
+ "Is it true that ", peeps, " is a bot?";
+
+ }
+}
diff --git a/base/botfiles/bots/tony_w.c b/base/botfiles/bots/tony_w.c
new file mode 100644
index 00000000..d58dcaa4
--- /dev/null
+++ b/base/botfiles/bots/tony_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 50
+//shotgun
+#define SGW 190
+//machinegun
+#define MGW 100
+//grenade launcher
+#define GLW 190
+//rocket launcher
+#define RLW 200
+//railgun
+#define RGW 160
+//bfg10k
+#define BFW 80
+//lightninggun
+#define LGW 190
+//plasmagun
+#define PGW 175
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 185
+//nailgun
+#define NGW 260
+//chaingun
+#define CGW 215
+
+#include "fuzw.c"
diff --git a/base/botfiles/bots/widowe_c.c b/base/botfiles/bots/widowe_c.c
new file mode 100644
index 00000000..f282df6f
--- /dev/null
+++ b/base/botfiles/bots/widowe_c.c
@@ -0,0 +1,202 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "chars.h"
+
+
+skill 1
+{
+ CHARACTERISTIC_NAME "Widowe"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 0.25
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/widowe_w.c"
+ CHARACTERISTIC_AIM_SKILL 0.25
+ CHARACTERISTIC_AIM_ACCURACY 0.25
+ CHARACTERISTIC_VIEW_FACTOR 0.25
+ CHARACTERISTIC_VIEW_MAXCHANGE 90
+ CHARACTERISTIC_REACTIONTIME 3.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/widowe_t.c"
+ CHARACTERISTIC_CHAT_NAME "widowe"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.5
+ CHARACTERISTIC_CHAT_MISC 0.5
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.5
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.5
+ CHARACTERISTIC_CHAT_KILL 0.5
+ CHARACTERISTIC_CHAT_DEATH 0.5
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.5
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.5
+ CHARACTERISTIC_CHAT_HITNOKILL 0.5
+ CHARACTERISTIC_CHAT_RANDOM 0.5
+ CHARACTERISTIC_CHAT_REPLY 0.5
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 0.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 0.5
+ CHARACTERISTIC_GRAPPLE_USER 0.5
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/widowe_i.c"
+ CHARACTERISTIC_AGGRESSION 0.25
+ CHARACTERISTIC_SELFPRESERVATION 0.5
+ CHARACTERISTIC_VENGEFULNESS 0.25
+ CHARACTERISTIC_CAMPER 0.25
+
+ CHARACTERISTIC_EASY_FRAGGER 0.5
+ CHARACTERISTIC_ALERTNESS 0.5
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.3
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.3
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.3
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.3
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.3
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.3
+
+ CHARACTERISTIC_FIRETHROTTLE 0.3
+}
+
+skill 4
+{
+ CHARACTERISTIC_NAME "Widowe"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/widowe_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 0.9
+ CHARACTERISTIC_VIEW_MAXCHANGE 240
+ CHARACTERISTIC_REACTIONTIME 1.75
+
+ CHARACTERISTIC_CHAT_FILE "bots/widowe_t.c"
+ CHARACTERISTIC_CHAT_NAME "widowe"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.1
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/widowe_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.5
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.5
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 0.75
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 0.75
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 0.75
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 0.75
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 0.75
+ CHARACTERISTIC_AIM_SKILL_BFG10K 0.75
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
+
+skill 5
+{
+ CHARACTERISTIC_NAME "Widowe"
+ CHARACTERISTIC_GENDER "female"
+ CHARACTERISTIC_ATTACK_SKILL 1.0
+ CHARACTERISTIC_WEAPONWEIGHTS "bots/widowe_w.c"
+ CHARACTERISTIC_AIM_SKILL 1.0
+ CHARACTERISTIC_AIM_ACCURACY 1.0
+ CHARACTERISTIC_VIEW_FACTOR 1.0
+ CHARACTERISTIC_VIEW_MAXCHANGE 360
+ CHARACTERISTIC_REACTIONTIME 0.0
+
+ CHARACTERISTIC_CHAT_FILE "bots/widowe_t.c"
+ CHARACTERISTIC_CHAT_NAME "widowe"
+ CHARACTERISTIC_CHAT_CPM 400
+ CHARACTERISTIC_CHAT_INSULT 0.1
+ CHARACTERISTIC_CHAT_MISC 0.1
+ CHARACTERISTIC_CHAT_STARTENDLEVEL 0.1
+ CHARACTERISTIC_CHAT_ENTEREXITGAME 0.1
+ CHARACTERISTIC_CHAT_KILL 0.1
+ CHARACTERISTIC_CHAT_DEATH 0.1
+ CHARACTERISTIC_CHAT_ENEMYSUICIDE 0.1
+ CHARACTERISTIC_CHAT_HITTALKING 0.1
+ CHARACTERISTIC_CHAT_HITNODEATH 0.1
+ CHARACTERISTIC_CHAT_HITNOKILL 0.1
+ CHARACTERISTIC_CHAT_RANDOM 0.1
+ CHARACTERISTIC_CHAT_REPLY 0.1
+
+ CHARACTERISTIC_CROUCHER 0.0
+ CHARACTERISTIC_JUMPER 1.0
+ CHARACTERISTIC_WALKER 0.0
+ CHARACTERISTIC_WEAPONJUMPING 1.0
+ CHARACTERISTIC_GRAPPLE_USER 1.0
+
+ CHARACTERISTIC_ITEMWEIGHTS "bots/widowe_i.c"
+ CHARACTERISTIC_AGGRESSION 1.0
+ CHARACTERISTIC_SELFPRESERVATION 1.0
+ CHARACTERISTIC_VENGEFULNESS 1.0
+ CHARACTERISTIC_CAMPER 0.0
+
+ CHARACTERISTIC_EASY_FRAGGER 1.0
+ CHARACTERISTIC_ALERTNESS 1.0
+
+ CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 0.7
+ CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 1.0
+ CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_RAILGUN 1.0
+ CHARACTERISTIC_AIM_ACCURACY_BFG10K 1.0
+ CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 1.0
+ CHARACTERISTIC_AIM_SKILL_PLASMAGUN 1.0
+ CHARACTERISTIC_AIM_SKILL_BFG10K 1.0
+
+ CHARACTERISTIC_FIRETHROTTLE 1.0
+}
diff --git a/base/botfiles/bots/widowe_i.c b/base/botfiles/bots/widowe_i.c
new file mode 100644
index 00000000..b620615c
--- /dev/null
+++ b/base/botfiles/bots/widowe_i.c
@@ -0,0 +1,120 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+
+//health
+#define FPH 2
+//armor
+#define FPA 2
+//without the weapons
+//shotgun
+#define SGW 200
+//machinegun
+#define MGW 50
+//grenadelauncher
+#define GLW 400
+//rocket launcher
+#define RLW 400
+//rail gun
+#define RGW 260
+//bfg10k
+#define BFW 400
+//lightninggun
+#define LGW 50
+//plasmagun
+#define PGW 250
+//prox-launcher
+#define PXW 350
+//nailgun
+#define NGW 150
+//chaingun
+#define CGW 200
+
+
+
+
+//with the weapons
+//shotgun
+#define GSGW 50
+//machinegun
+#define GMGW 50
+//grenadelauncher
+#define GGLW 400
+//rocketlauncher
+#define GRLW 210
+//railgun
+#define GRGW 50
+//bfg10k
+#define GBFW 400
+//lightninggun
+#define GLGW 50
+//plasmagun
+#define GPGW 50
+//prox-launcher
+#define GPXW 200
+//failgun
+#define GNGW 100
+//chaingun
+#define GCGW 125
+//individual powerups
+//teleport
+#define TELW 190
+//medkit
+#define MEDW 50
+//quad-damage
+#define QW 500
+//envirosuit
+#define ENVW 50
+//haste
+#define HAW 50
+//invisibility
+#define INW 400
+//regeneration
+#define REGW 50
+//flight
+#define FLW 15
+//kamikaze
+#define KAMW 200
+//invulnerability
+#define IBW 150
+//portal
+#define PORW 300
+//scout
+#define SCW 100
+//guard
+#define GUW 200
+//doubler
+#define DUBW 100
+//ammo-regen
+#define AMRW 400
+//red-cube
+#define REDCW 200
+//blue-cube
+#define BLCW 200
+//ctf flag weight
+#define FGW 400
+
+//
+#include "fuzi.c"
diff --git a/base/botfiles/bots/widowe_t.c b/base/botfiles/bots/widowe_t.c
new file mode 100644
index 00000000..606b12da
--- /dev/null
+++ b/base/botfiles/bots/widowe_t.c
@@ -0,0 +1,275 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+chat "Widowe"
+{
+ //the teamplay.h file is included for all kinds of teamplay chats
+ #include "teamplay.h"
+ //======================================================
+ //======================================================
+ type "game_enter" //initiated when the bot enters the game
+ {
+ "Hello.";
+ HELLO1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "game_exit" //initiated when the bot exits the game
+ {
+ "Look at the ~time";
+ GOODBYE1;
+ GOODBYE0;
+ // 0 = bot name
+ // 1 = random opponent
+ // 4 = level's title
+ } //end type
+ type "level_start" //initiated when a new level starts
+ {
+ 0, " it is time for some payback!";
+ 1, " you are going to have some pain in ", 4, ".";
+ HELLO2;
+
+ // 0 = bot name
+ } //end type
+ type "level_end" //initiated when a level ends and the bot is not first and not last in the rankings
+ {
+ 2, ", I let you win.";
+ 4, " has changed a lot, it is much faster now.";
+ "Is it over yet?";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_victory" //initiated when a level ends and the bot is first in the rankings
+ {
+ 3, " you need to practice more... and forget about winning against me.";
+ LEVEL_END_VICTORY1;
+ // 0 = bot name
+ // 1 = random opponent
+ // 3 = opponent in last place
+ // 4 = level's title
+ } //end type
+ type "level_end_lose" //initiated when a level ends and the bot is last in the rankings
+ {
+ 2, " cheated.";
+ "I had a hang nail, so of course I lost.";
+ "So much for my bluster...";
+ "I felt bad for you so I let you win.";
+ // 0 = bot name
+ // 1 = random opponent
+ // 2 = opponent in first place
+ // 4 = level's title
+ } //end type
+ //======================================================
+ //======================================================
+ type "hit_talking" //bot is hit while chat balloon is visible; lecture attacker on poor sportsmanship
+ {
+ 0, ", didn't your mother ever tell you it was rude to interrupt a conversation?";
+ "I am going to shove that ", 1, " down your throat if you do that again!";
+ DEATH_TALKING;
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nodeath" //bot is hit by an opponent's weapon attack but didn't die; either praise or insult
+ {
+ 1, " is not a good weapon, a ", weapon, " should be more your speed.";
+ // 0 = shooter
+ // 1 = weapon used by shooter
+ } //end type
+ type "hit_nokill" //bot hits an opponent but does not kill it
+ {
+ 0, " must be cheating.";
+ "Well that sucked...";
+ "Note to self... turn off safety next ~time";
+ // 0 = opponent
+ } //end type
+ type "enemy_suicide" //enemy of the bot commits suicide
+ {
+ "Stop smoking ", substance, " and maybe you won't kill yourself so often.";
+ "Tired of life, ", 0, "? Give it up.";
+ "I guess that beats dying of ", disease, "...";
+ // 0 = enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "death_telefrag" //initiated when the bot is killed by a telefrag
+ {
+ "I hate praetorian impressions.";
+ "My ", counselor, " warned about days like this.";
+ "D'oh!";
+ DEATH_TELEFRAGGED1;
+ // 0 = enemy name
+ } //end type
+ type "death_cratered" //initiated when the bot is killed by taking "normal" falling damage
+ {
+ DEATH_FALLING0;
+ "It didn't look that high from up there...";
+ "*sigh*";
+ // 0 = random opponent
+ } //end type
+ type "death_lava" //initiated when the bot dies in lava
+ {
+ "Well... it beats a case of hypothermia.";
+ "At least it is warm here";
+ DEATH_SUICIDE1;
+ // 0 = random opponent
+ } //end type
+ type "death_slime" //initiated when the bot dies in slime
+ {
+ "Green has never been my color...";
+ DEATH_SLIME1;
+ // 0 = random opponent
+ } //end type
+ type "death_drown" //initiated when the bot drowns
+ {
+ DEATH_DROWN0;
+ "It isn't that difficult to just breath water...";
+ "So why can't I breath water?";
+ // 0 = random opponent
+ } //end type
+ type "death_suicide" //initiated when bot blows self up with a weapon or craters
+ {
+ DEATH_SUICIDE2;
+ "So much for life and all of its cruel irony.";
+ "It is just easier for ", 0, " this way.";
+
+
+ // 0 = random opponent
+ } //end type
+ type "death_gauntlet" //initiated when the bot is killed by a gauntlet attack
+ {
+ "Unsanitary.";
+ "What part of '~Don't touch me there' do you not understand?";
+ DEATH_GAUNTLET1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Gauntlet)
+ } //end type
+ type "death_rail" //initiated when the bot is killed by a rail gun shot
+ {
+ DEATH_INSULT0;
+ DEATH_FEM_INSULT1;
+ DEATH_INSULT5;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to Railgun)
+ } //end type
+ type "death_bfg" //initiated when the bot died by a BFG
+ {
+ "Can't find a skill weapon? Or is it just that you suck?";
+ "Over-compensating for something?";
+ DEATH_BFG0;
+ DEATH_BFG2;
+ // 0 = enemy name
+ // 1 = weapon used by enemy (NOTE: always set to BFG10K)
+ } //end type
+ type "death_insult" //insult initiated when the bot died
+ {
+ curse;
+ "This is far more painful than it looks.";
+ "One day, ", 0, " you me and a ", weapon, " are going to have a discussion.";
+ "Is that the best you can do?";
+ DEATH_INSULT2;
+ DEATH_INSULT0;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ type "death_praise" //praise initiated when the bot died
+ {
+ "Not bad, ", 0, ", have you been practicing?";
+ "I never saw it coming.";
+ D_PRAISE0;
+ D_PRAISE1;
+ // 0 = enemy name
+ // 1 = weapon used by enemy
+ } //end type
+ //======================================================
+ //======================================================
+ type "kill_rail" //initiated when the bot kills someone with rail gun
+ {
+ 0, ", you should stay down...";
+ "*sigh* if only this was challenging.";
+ "I love this gun!";
+ "Way too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_gauntlet" //initiated when the bot kills someone with gauntlet
+ {
+ "LOL!";
+ "Too easy";
+ // 0 = enemy name
+ } //end type
+ type "kill_telefrag" //initiated when the bot telefragged someone
+ {
+ "LOL!";
+ "Aww man... now I have to take a bath to get the brains out.";
+ "Does anyone have a quick way of getting brains out of your hair?";
+ // 0 = enemy name
+ } //end type
+ type "kill_insult" //insult initiated when the bot killed someone
+ {
+ KILL_INSULT4;
+ "Why do you even bother?";
+ "This is why the upper classes are called the 'ruling elite.'";
+ "Why do the lower classes think they can match someone of my caliber?";
+
+ // 0 = enemy name
+ } //end type
+ type "kill_praise" //praise initiated when the bot killed someone
+ {
+ "You are getting better, ", 0, ", keep it up and you might actually win something.";
+ "That was a challenge.";
+ // 0 = enemy name
+ } //end type
+ //======================================================
+ //======================================================
+ type "random_insult" //insult initiated randomly (just when the bot feels like it)
+ {
+ TAUNT0;
+ TAUNT_FEM0;
+ TAUNT1;
+ curse;
+ "You should give up your ", substance, " addiction by next ", month, ".";
+ "I saw those pictures of ", 0, " and a ", animal, " posted on the web last night... Like, ewww!";
+ immaturity01;
+ "Your ", family_member, " needs to stop calling me.";
+
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+ type "random_misc" //miscellanous chats initiated randomly
+ {
+ GRRLTALK0;
+ MISC4;
+ "Has anyone tried out the new ", 5, "? Is it worth the upgrade?";
+ MISC1;
+ // 0 = name of randomly chosen player
+ // 1 = name of the last player killed by this bot
+ // 4 = level's title
+ // 5 = random weapon from weapon list
+ } //end type
+} //end chat
+
diff --git a/base/botfiles/bots/widowe_w.c b/base/botfiles/bots/widowe_w.c
new file mode 100644
index 00000000..7958e74a
--- /dev/null
+++ b/base/botfiles/bots/widowe_w.c
@@ -0,0 +1,55 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+/*weapon defines weights 10-500
+ try to keep it balanced*/
+
+#include "inv.h"
+//gauntlet
+#define GTW 25
+//shotgun
+#define SGW 130
+//machinegun
+#define MGW 90
+//grenade launcher
+#define GLW 125
+//rocket launcher
+#define RLW 190
+//railgun
+#define RGW 200
+//bfg10k
+#define BFW 105
+//lightninggun
+#define LGW 120
+//plasmagun
+#define PGW 190
+//grapplinghook
+#define GRW 10
+//prox-launcher
+#define PXW 130
+//nailgun
+#define NGW 160
+//chaingun
+#define CGW 180
+
+#include "fuzw.c"
diff --git a/base/botfiles/chars.h b/base/botfiles/chars.h
new file mode 100644
index 00000000..ae96f567
--- /dev/null
+++ b/base/botfiles/chars.h
@@ -0,0 +1,134 @@
+/*
+===========================================================================
+Copyright (C) 1999-2005 Id Software, Inc.
+
+This file is part of Quake III Arena source code.
+
+Quake III Arena source code is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Quake III Arena source code is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+//========================================================
+//========================================================
+//name
+#define CHARACTERISTIC_NAME 0 //string
+//gender of the bot
+#define CHARACTERISTIC_GENDER 1 //string ("male", "female", "it")
+//attack skill
+// > 0.0 && < 0.2 = don't move
+// > 0.3 && < 1.0 = aim at enemy during retreat
+// > 0.0 && < 0.4 = only move forward/backward
+// >= 0.4 && < 1.0 = circle strafing
+// > 0.7 && < 1.0 = random strafe direction change
+#define CHARACTERISTIC_ATTACK_SKILL 2 //float [0, 1]
+//weapon weight file
+#define CHARACTERISTIC_WEAPONWEIGHTS 3 //string
+//view angle difference to angle change factor
+#define CHARACTERISTIC_VIEW_FACTOR 4 //float <0, 1]
+//maximum view angle change
+#define CHARACTERISTIC_VIEW_MAXCHANGE 5 //float [1, 360]
+//reaction time in seconds
+#define CHARACTERISTIC_REACTIONTIME 6 //float [0, 5]
+//accuracy when aiming
+#define CHARACTERISTIC_AIM_ACCURACY 7 //float [0, 1]
+//weapon specific aim accuracy
+#define CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 8 //float [0, 1]
+#define CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 9 //float [0, 1]
+#define CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 10 //float [0, 1]
+#define CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 11 //float [0, 1]
+#define CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 12
+#define CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 13 //float [0, 1]
+#define CHARACTERISTIC_AIM_ACCURACY_RAILGUN 14
+#define CHARACTERISTIC_AIM_ACCURACY_BFG10K 15 //float [0, 1]
+//skill when aiming
+// > 0.0 && < 0.9 = aim is affected by enemy movement
+// > 0.4 && <= 0.8 = enemy linear leading
+// > 0.8 && <= 1.0 = enemy exact movement leading
+// > 0.5 && <= 1.0 = prediction shots when enemy is not visible
+// > 0.6 && <= 1.0 = splash damage by shooting nearby geometry
+#define CHARACTERISTIC_AIM_SKILL 16 //float [0, 1]
+//weapon specific aim skill
+#define CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 17 //float [0, 1]
+#define CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 18 //float [0, 1]
+#define CHARACTERISTIC_AIM_SKILL_PLASMAGUN 19 //float [0, 1]
+#define CHARACTERISTIC_AIM_SKILL_BFG10K 20 //float [0, 1]
+//========================================================
+//chat
+//========================================================
+//file with chats
+#define CHARACTERISTIC_CHAT_FILE 21 //string
+//name of the chat character
+#define CHARACTERISTIC_CHAT_NAME 22 //string
+//characters per minute type speed
+#define CHARACTERISTIC_CHAT_CPM 23 //integer [1, 4000]
+//tendency to insult/praise
+#define CHARACTERISTIC_CHAT_INSULT 24 //float [0, 1]
+//tendency to chat misc
+#define CHARACTERISTIC_CHAT_MISC 25 //float [0, 1]
+//tendency to chat at start or end of level
+#define CHARACTERISTIC_CHAT_STARTENDLEVEL 26 //float [0, 1]
+//tendency to chat entering or exiting the game
+#define CHARACTERISTIC_CHAT_ENTEREXITGAME 27 //float [0, 1]
+//tendency to chat when killed someone
+#define CHARACTERISTIC_CHAT_KILL 28 //float [0, 1]
+//tendency to chat when died
+#define CHARACTERISTIC_CHAT_DEATH 29 //float [0, 1]
+//tendency to chat when enemy suicides
+#define CHARACTERISTIC_CHAT_ENEMYSUICIDE 30 //float [0, 1]
+//tendency to chat when hit while talking
+#define CHARACTERISTIC_CHAT_HITTALKING 31 //float [0, 1]
+//tendency to chat when bot was hit but didn't dye
+#define CHARACTERISTIC_CHAT_HITNODEATH 32 //float [0, 1]
+//tendency to chat when bot hit the enemy but enemy didn't dye
+#define CHARACTERISTIC_CHAT_HITNOKILL 33 //float [0, 1]
+//tendency to randomly chat
+#define CHARACTERISTIC_CHAT_RANDOM 34 //float [0, 1]
+//tendency to reply
+#define CHARACTERISTIC_CHAT_REPLY 35 //float [0, 1]
+//========================================================
+//movement
+//========================================================
+//tendency to crouch
+#define CHARACTERISTIC_CROUCHER 36 //float [0, 1]
+//tendency to jump
+#define CHARACTERISTIC_JUMPER 37 //float [0, 1]
+//tendency to walk
+#define CHARACTERISTIC_WALKER 48 //float [0, 1]
+//tendency to jump using a weapon
+#define CHARACTERISTIC_WEAPONJUMPING 38 //float [0, 1]
+//tendency to use the grapple hook when available
+#define CHARACTERISTIC_GRAPPLE_USER 39 //float [0, 1] //use this!!
+//========================================================
+//goal
+//========================================================
+//item weight file
+#define CHARACTERISTIC_ITEMWEIGHTS 40 //string
+//the aggression of the bot
+#define CHARACTERISTIC_AGGRESSION 41 //float [0, 1]
+//the self preservation of the bot (rockets near walls etc.)
+#define CHARACTERISTIC_SELFPRESERVATION 42 //float [0, 1]
+//how likely the bot is to take revenge
+#define CHARACTERISTIC_VENGEFULNESS 43 //float [0, 1] //use this!!
+//tendency to camp
+#define CHARACTERISTIC_CAMPER 44 //float [0, 1]
+//========================================================
+//========================================================
+//tendency to get easy frags
+#define CHARACTERISTIC_EASY_FRAGGER 45 //float [0, 1]
+//how alert the bot is (view distance)
+#define CHARACTERISTIC_ALERTNESS 46 //float [0, 1]
+//how much the bot fires it's weapon
+#define CHARACTERISTIC_FIRETHROTTLE 47 //float [0, 1]
+
diff --git a/base/botfiles/fuzi.c b/base/botfiles/fuzi.c
new file mode 100644
index 00000000..fea81da8
--- /dev/null
+++ b/base/botfiles/fuzi.c
@@ -0,0 +1,692 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+
+#define ARMOR 20
+#define AMMO 20
+#define HEALTH 20
+#define POWERUP 20
+#define WEAPON 20
+
+//breaks compatibility with the existing q3a bots, sorry.
+#define FP(x) (x < 0 ? 1 : x)
+#define ARS(x) balance($evalfloat(FP(FPA/x)), $evalfloat(FP(FPA/x-ARMOR)), $evalfloat(FP(FPA/x+ARMOR)))
+#define AS(x) balance($evalfloat(FP(x)), $evalfloat(FP(x/AMMO)), $evalfloat(FP(x*AMMO)))
+#define HS(x) balance($evalfloat(FP(FPH/x)), $evalfloat(FP(FPH/x-HEALTH)), $evalfloat(FP(FPH/x+HEALTH)))
+#define PS(x) balance($evalfloat(FP(x)), $evalfloat(FP(x/POWERUP)), $evalfloat(FP(x*POWERUP)))
+#define WS(x) balance($evalfloat(FP(x)), $evalfloat(FP(x/WEAPON)), $evalfloat(FP(x*WEAPON)))
+
+
+weight "item_armor_shard"
+{
+switch(INVENTORY_SCOUT)
+ {
+ case 1:
+ {
+ switch(INVENTORY_ARMOR)
+ {
+ case 10: return ARS(20);
+ case 20: return ARS(20);
+ case 30: return ARS(20);
+ case 40: return ARS(19);
+ case 50: return ARS(19);
+ case 60: return ARS(19);
+ case 70: return ARS(19);
+ case 80: return ARS(18);
+ case 90: return ARS(18);
+ case 100: return ARS(15);
+ case 110: return ARS(15);
+ case 120: return ARS(15);
+ case 130: return ARS(15);
+ case 140: return ARS(12);
+ case 150: return ARS(12);
+ case 160: return ARS(12);
+ case 170: return ARS(12);
+ case 180: return ARS(12);
+ case 190: return ARS(11);
+ case 200: return ARS(11);
+ default: return ARS(1);
+ }
+ }
+ default: return 0;
+ }
+}
+
+weight "item_armor_combat"
+{
+ switch(INVENTORY_SCOUT)
+ {
+ case 1:
+ {
+ switch(INVENTORY_ARMOR)
+ {
+ case 10: return ARS(80);
+ case 20: return ARS(70);
+ case 30: return ARS(65);
+ case 40: return ARS(65);
+ case 50: return ARS(65);
+ case 60: return ARS(60);
+ case 70: return ARS(60);
+ case 80: return ARS(40);
+ case 90: return ARS(40);
+ case 100: return ARS(40);
+ case 110: return ARS(30);
+ case 120: return ARS(30);
+ case 130: return ARS(30);
+ case 140: return ARS(25);
+ case 150: return ARS(25);
+ case 160: return ARS(25);
+ case 170: return ARS(25);
+ case 180: return ARS(20);
+ case 190: return ARS(20);
+ case 200: return ARS(20);
+ default: return ARS(1);
+ }
+ }
+ default: return 0;
+ }
+}
+
+weight "item_armor_body"
+{
+ switch(INVENTORY_SCOUT)
+ {
+ case 1:
+ {
+ switch(INVENTORY_ARMOR)
+ {
+ case 10: return ARS(100);
+ case 20: return ARS(95);
+ case 30: return ARS(95);
+ case 40: return ARS(95);
+ case 50: return ARS(90);
+ case 60: return ARS(60);
+ case 70: return ARS(60);
+ case 80: return ARS(55);
+ case 90: return ARS(55);
+ case 100: return ARS(50);
+ case 110: return ARS(40);
+ case 120: return ARS(40);
+ case 130: return ARS(35);
+ case 140: return ARS(25);
+ case 150: return ARS(15);
+ case 160: return ARS(15);
+ case 170: return ARS(15);
+ case 180: return ARS(10);
+ case 190: return ARS(10);
+ case 200: return ARS(10);
+ default: return ARS(1);
+ }
+ }
+ default: return 0;
+ }
+}
+
+weight "item_health_small"
+{
+ switch(INVENTORY_HEALTH)
+ {
+ case 10: return HS(100);
+ case 20: return HS(90);
+ case 30: return HS(85);
+ case 40: return HS(80);
+ case 50: return HS(75);
+ case 60: return HS(70);
+ case 70: return HS(65);
+ case 80: return HS(60);
+ case 90: return HS(55);
+ case 100: return HS(50);
+ default: return 0;
+ }
+}
+
+weight "item_health"
+{
+ switch(INVENTORY_HEALTH)
+ {
+ case 10: return HS(110);
+ case 20: return HS(100);
+ case 30: return HS(90);
+ case 40: return HS(80);
+ case 50: return HS(70);
+ case 60: return HS(60);
+ case 70: return HS(50);
+ case 80: return HS(40);
+ case 90: return HS(30);
+ case 100: return HS(30);
+ default: return 0;
+ }
+}
+
+weight "item_health_large"
+{
+
+ switch(INVENTORY_HEALTH)
+ {
+ case 10: return HS(120);
+ case 20: return HS(110);
+ case 30: return HS(100);
+ case 40: return HS(90);
+ case 50: return HS(80);
+ case 60: return HS(70);
+ case 70: return HS(60);
+ case 80: return HS(50);
+ case 90: return HS(40);
+ case 100: return HS(30);
+ default: return 0;
+ }
+}
+
+weight "item_health_mega"
+{
+ switch(INVENTORY_HEALTH)
+ {
+ case 10: return HS(150);
+ case 20: return HS(120);
+ case 30: return HS(110);
+ case 40: return HS(100);
+ case 50: return HS(90);
+ case 60: return HS(90);
+ case 70: return HS(80);
+ case 80: return HS(80);
+ case 90: return HS(70);
+ case 100: return HS(60);
+ default: return 0;
+ }
+}
+
+weight "weapon_shotgun_mp"
+{
+ switch(INVENTORY_SHOTGUN)
+ {
+ case 1: return WS(SGW);
+ default: return 1;
+ }
+}
+
+weight "weapon_machinegun_mp"
+{
+ switch(INVENTORY_MACHINEGUN)
+ {
+ case 1: return WS(MGW);
+ default: return 1;
+ }
+}
+
+weight "weapon_grenadelauncher_mp"
+{
+ switch(INVENTORY_GRENADELAUNCHER)
+ {
+ case 1: return WS(GLW);
+ default: return 1;
+ }
+}
+
+weight "weapon_rocketlauncher_mp"
+{
+ switch(INVENTORY_ROCKETLAUNCHER)
+ {
+ case 1: return WS(RLW);
+ default: return 1;
+ }
+}
+
+weight "weapon_lightning_mp"
+{
+ switch(INVENTORY_LIGHTNING)
+ {
+ case 1: return WS(LGW);
+ default: return 1;
+ }
+}
+
+weight "weapon_railgun_mp"
+{
+ switch(INVENTORY_RAILGUN)
+ {
+ case 1: return WS(RGW);
+ default: return 1;
+ }
+}
+
+weight "weapon_plasmagun_mp"
+{
+ switch(INVENTORY_PLASMAGUN)
+ {
+ case 1: return WS(PGW);
+ default: return 1;
+ }
+}
+
+weight "weapon_bfg_mp"
+{
+ switch(INVENTORY_BFG10K)
+ {
+ case 1: return WS(BFW);
+ default: return 1;
+ }
+}
+
+weight "weapon_nailgun_mp"
+{
+ switch(INVENTORY_NAILGUN)
+ {
+ case 1: return WS(NGW);
+ default: return 1;
+ }
+}
+
+weight "weapon_prox_launcher_mp"
+{
+ switch(INVENTORY_PROXLAUNCHER)
+ {
+ case 1: return WS(PXW);
+ default: return 1;
+ }
+}
+
+weight "weapon_chaingun"
+{
+ switch(INVENTORY_CHAINGUN)
+ {
+ case 1: return WS(CGW);
+ default: return 1;
+ }
+}
+
+
+weight "ammo_shells"
+{
+ switch(INVENTORY_SHELLS)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(11);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_bullets"
+{
+ switch(INVENTORY_BULLETS)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(30);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_grenades"
+{
+ switch(INVENTORY_GRENADES)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(11);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_cells"
+{
+ switch(INVENTORY_CELLS)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(30);
+ case 80: return AS(30);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_lightning"
+{
+ switch(INVENTORY_LIGHTNINGAMMO)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(30);
+ case 80: return AS(30);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_rockets"
+{
+ switch(INVENTORY_ROCKETS)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(11);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_slugs"
+{
+ switch(INVENTORY_SLUGS)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(11);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_bfg"
+{
+ switch(INVENTORY_BFGAMMO)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(11);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+
+weight "ammo_nails"
+{
+ switch(INVENTORY_NAILS)
+ {
+ case 20: return AS(30);
+ case 40: return AS(30);
+ case 60: return AS(11);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_mines"
+{
+ switch(INVENTORY_MINES)
+ {
+ case 20: return AS(30);
+ case 40: return AS(11);
+ case 60: return AS(11);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+weight "ammo_belt"
+{
+ switch(INVENTORY_BELT)
+ {
+ case 20: return AS(30);
+ case 40: return AS(11);
+ case 60: return AS(11);
+ case 80: return AS(11);
+ case 100: return AS(11);
+ case 120: return AS(11);
+ case 140: return AS(11);
+ case 160: return AS(11);
+ case 180: return AS(11);
+ case 200: return AS(11);
+ default: return 0;
+ }
+}
+
+
+//needs work
+
+weight "holdable_teleporter"
+{
+ switch(INVENTORY_TELEPORTER)
+ {
+ case 1: return PS(TELW);
+ default: return 0;
+ }
+}
+
+weight "holdable_medkit"
+{
+ switch(INVENTORY_TELEPORTER)
+ {
+ case 1: return PS(MEDW);
+ default: return 0;
+ }
+}
+
+weight "holdable_kamikaze"
+{
+ switch(INVENTORY_TELEPORTER)
+ {
+ case 1: return PS(KAMW);
+ default: return 0;
+ }
+}
+
+weight "holdable_portal"
+{
+ switch(INVENTORY_TELEPORTER)
+ {
+ case 1: return PS(PORW);
+ default: return 0;
+ }
+}
+
+weight "holdable_invulnerability"
+{
+ switch(INVENTORY_TELEPORTER)
+ {
+ case 1: return PS(IBW);
+ default: return 0;
+ }
+}
+
+weight "item_quad"
+{
+ return PS(QW);
+}
+
+weight "item_enviro"
+{
+ return PS(ENVW);
+}
+
+weight "item_haste"
+{
+ return PS(HAW);
+}
+
+weight "item_invisibility"
+{
+ return PS(INW);
+}
+
+weight "item_regen"
+{
+ return PS(REGW);
+}
+
+weight "item_flight"
+{
+ return PS(FLW);
+}
+
+weight "item_scout"
+{
+ switch(INVENTORY_SCOUT)
+ {
+ case 1: return PS(SCW);
+ default: return 0;
+ }
+}
+
+weight "item_guard"
+{
+ switch(INVENTORY_SCOUT)
+ {
+ case 1: return PS(GUW);
+ default: return 0;
+ }
+}
+
+weight "item_doubler"
+{
+ switch(INVENTORY_SCOUT)
+ {
+ case 1: return PS(DUBW);
+ default: return 0;
+ }
+}
+
+weight "item_ammoregen"
+{
+ switch(INVENTORY_SCOUT)
+ {
+ case 1: return PS(AMRW);
+ default: return 0;
+ }
+}
+
+
+//=============================================
+// This is only used to pickup dropped CTF
+// flags now. The logic in here makes no
+// sense since the bot has specific CTF AI.
+// yet without it the bots barely move towards
+// the opposing flags due to low flag weights.
+//=============================================
+
+weight "team_CTF_redflag"
+{
+ switch(INVENTORY_REDFLAG)
+ {
+ case 1: return FGW;
+ default: return 300;
+ }
+}
+
+weight "team_CTF_blueflag"
+{
+ switch(INVENTORY_BLUEFLAG)
+ {
+ case 1: return FGW;
+ default: return 300;
+ }
+}
+
+
+weight "team_CTF_neutralflag"
+{
+ return FGW;
+}
+
+weight "item_redcube"
+{
+ return REDCW;
+}
+
+weight "item_bluecube"
+{
+ return BLCW;
+}
+
+weight "item_botroam"
+{
+ return 1;
+}
+
+weight "team_dom_pointWhite"
+{
+ return 1000;
+}
+
+weight "team_dom_pointRed"
+{
+ return 700;
+}
+
+weight "team_dom_pointBlue"
+{
+ return 700;
+}
diff --git a/base/botfiles/fuzw.c b/base/botfiles/fuzw.c
new file mode 100644
index 00000000..e5533c4b
--- /dev/null
+++ b/base/botfiles/fuzw.c
@@ -0,0 +1,282 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+weight "BFG10K"
+{
+ switch(INVENTORY_BFG10K)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_BFGAMMO)
+ {
+ case 1: return 0;
+ default: return BFW;
+ }
+ }
+ }
+}
+
+weight "Chaingun"
+{
+ switch(INVENTORY_CHAINGUN)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_BELT)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 900: return CGW;
+ default: return $evalint(CGW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+weight "Gauntlet"
+{
+ switch(INVENTORY_GAUNTLET)
+ {
+ case 1: return 0;
+ default: return GTW;
+ }
+}
+
+weight "Grappling Hook"
+{
+ switch(INVENTORY_GRAPPLINGHOOK)
+ {
+ case 1: return 0;
+ default: return GRW;
+ }
+}
+
+
+weight "Grenade Launcher"
+{
+ switch(INVENTORY_GRENADELAUNCHER)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_GRENADES)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 600: return GLW;
+ default: return $evalint(GLW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
+
+weight "Lightning Gun"
+{
+ switch(INVENTORY_LIGHTNING)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_LIGHTNINGAMMO)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 768: return LGW;
+ default: return $evalint(LGW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
+
+weight "Machinegun"
+{
+ switch(INVENTORY_MACHINEGUN)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_BULLETS)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 800: return MGW;
+ default: return $evalint(MGW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
+
+weight "Nailgun"
+{
+ switch(INVENTORY_NAILGUN)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_NAILS)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 800: return NGW;
+ default: return $evalint(NGW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
+
+weight "Plasma Gun"
+{
+ switch(INVENTORY_PLASMAGUN)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_CELLS)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 2000: return PGW;
+ default: return $evalint(PGW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
+
+weight "Prox Launcher"
+{
+ switch(INVENTORY_PROXLAUNCHER)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_MINES)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 200: return PXW;
+ default: return $evalint(PXW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
+
+weight "Railgun"
+{
+ switch(INVENTORY_RAILGUN)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_SLUGS)
+ {
+ case 1: return 0;
+ default: return RGW;
+ }
+ }
+ }
+}
+
+
+weight "Rocket Launcher"
+{
+ switch(INVENTORY_ROCKETLAUNCHER)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_ROCKETS)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 4000: return RLW;
+ default: return $evalint(RLW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
+
+weight "Shotgun"
+{
+ switch(INVENTORY_SHOTGUN)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(INVENTORY_SHELLS)
+ {
+ case 1: return 0;
+ default:
+ {
+ switch(ENEMY_HORIZONTAL_DIST)
+ {
+ case 600: return SGW;
+ default: return $evalint(SGW*0.1);
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/base/botfiles/inv.h b/base/botfiles/inv.h
new file mode 100644
index 00000000..d429413a
--- /dev/null
+++ b/base/botfiles/inv.h
@@ -0,0 +1,184 @@
+/*
+===========================================================================
+Copyright (C) 1999-2005 Id Software, Inc.
+
+This file is part of Quake III Arena source code.
+
+Quake III Arena source code is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Quake III Arena source code is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#define INVENTORY_NONE 0
+//armor
+#define INVENTORY_ARMOR 1
+//weapons
+#define INVENTORY_GAUNTLET 4
+#define INVENTORY_SHOTGUN 5
+#define INVENTORY_MACHINEGUN 6
+#define INVENTORY_GRENADELAUNCHER 7
+#define INVENTORY_ROCKETLAUNCHER 8
+#define INVENTORY_LIGHTNING 9
+#define INVENTORY_RAILGUN 10
+#define INVENTORY_PLASMAGUN 11
+#define INVENTORY_BFG10K 13
+#define INVENTORY_GRAPPLINGHOOK 14
+#define INVENTORY_NAILGUN 15
+#define INVENTORY_PROXLAUNCHER 16
+#define INVENTORY_CHAINGUN 17
+//ammo
+#define INVENTORY_SHELLS 18
+#define INVENTORY_BULLETS 19
+#define INVENTORY_GRENADES 20
+#define INVENTORY_CELLS 21
+#define INVENTORY_LIGHTNINGAMMO 22
+#define INVENTORY_ROCKETS 23
+#define INVENTORY_SLUGS 24
+#define INVENTORY_BFGAMMO 25
+#define INVENTORY_NAILS 26
+#define INVENTORY_MINES 27
+#define INVENTORY_BELT 28
+//powerups
+#define INVENTORY_HEALTH 29
+#define INVENTORY_TELEPORTER 30
+#define INVENTORY_MEDKIT 31
+#define INVENTORY_KAMIKAZE 32
+#define INVENTORY_PORTAL 33
+#define INVENTORY_INVULNERABILITY 34
+#define INVENTORY_QUAD 35
+#define INVENTORY_ENVIRONMENTSUIT 36
+#define INVENTORY_HASTE 37
+#define INVENTORY_INVISIBILITY 38
+#define INVENTORY_REGEN 39
+#define INVENTORY_FLIGHT 40
+#define INVENTORY_SCOUT 41
+#define INVENTORY_GUARD 42
+#define INVENTORY_DOUBLER 43
+#define INVENTORY_AMMOREGEN 44
+
+#define INVENTORY_REDFLAG 45
+#define INVENTORY_BLUEFLAG 46
+#define INVENTORY_NEUTRALFLAG 47
+#define INVENTORY_REDCUBE 48
+#define INVENTORY_BLUECUBE 49
+//Elimination mod: Domination inventory
+#define INVENTORY_POINTWHITE 50
+#define INVENTORY_POINTRED 51
+#define INVENTORY_POINTBLUE 52
+
+
+//enemy stuff
+#define ENEMY_HORIZONTAL_DIST 200
+#define ENEMY_HEIGHT 201
+#define NUM_VISIBLE_ENEMIES 202
+#define NUM_VISIBLE_TEAMMATES 203
+
+// if running the mission pack
+#ifdef MISSIONPACK
+
+//#error "running mission pack"
+
+#endif
+
+//item numbers (make sure they are in sync with bg_itemlist in bg_misc.c)
+#define MODELINDEX_ARMORSHARD 1
+#define MODELINDEX_ARMORCOMBAT 2
+#define MODELINDEX_ARMORBODY 3
+#define MODELINDEX_HEALTHSMALL 4
+#define MODELINDEX_HEALTH 5
+#define MODELINDEX_HEALTHLARGE 6
+#define MODELINDEX_HEALTHMEGA 7
+
+#define MODELINDEX_GAUNTLET 8
+#define MODELINDEX_SHOTGUN 9
+#define MODELINDEX_MACHINEGUN 10
+#define MODELINDEX_GRENADELAUNCHER 11
+#define MODELINDEX_ROCKETLAUNCHER 12
+#define MODELINDEX_LIGHTNING 13
+#define MODELINDEX_RAILGUN 14
+#define MODELINDEX_PLASMAGUN 15
+#define MODELINDEX_BFG10K 16
+#define MODELINDEX_GRAPPLINGHOOK 17
+
+#define MODELINDEX_SHELLS 18
+#define MODELINDEX_BULLETS 19
+#define MODELINDEX_GRENADES 20
+#define MODELINDEX_CELLS 21
+#define MODELINDEX_LIGHTNINGAMMO 22
+#define MODELINDEX_ROCKETS 23
+#define MODELINDEX_SLUGS 24
+#define MODELINDEX_BFGAMMO 25
+
+#define MODELINDEX_TELEPORTER 26
+#define MODELINDEX_MEDKIT 27
+#define MODELINDEX_QUAD 28
+#define MODELINDEX_ENVIRONMENTSUIT 29
+#define MODELINDEX_HASTE 30
+#define MODELINDEX_INVISIBILITY 31
+#define MODELINDEX_REGEN 32
+#define MODELINDEX_FLIGHT 33
+
+#define MODELINDEX_REDFLAG 34
+#define MODELINDEX_BLUEFLAG 35
+
+// mission pack only defines
+
+#define MODELINDEX_KAMIKAZE 36
+#define MODELINDEX_PORTAL 37
+#define MODELINDEX_INVULNERABILITY 38
+
+#define MODELINDEX_NAILS 39
+#define MODELINDEX_MINES 40
+#define MODELINDEX_BELT 41
+
+#define MODELINDEX_SCOUT 42
+#define MODELINDEX_GUARD 43
+#define MODELINDEX_DOUBLER 44
+#define MODELINDEX_AMMOREGEN 45
+
+#define MODELINDEX_NEUTRALFLAG 46
+#define MODELINDEX_REDCUBE 47
+#define MODELINDEX_BLUECUBE 48
+
+#define MODELINDEX_NAILGUN 49
+#define MODELINDEX_PROXLAUNCHER 50
+#define MODELINDEX_CHAINGUN 51
+
+//Elimination mod: Double Domination and Standard Domination
+
+#define MODELINDEX_POINTABLUE 52
+#define MODELINDEX_POINTBBLUE 53
+#define MODELINDEX_POINTARED 54
+#define MODELINDEX_POINTBRED 55
+#define MODELINDEX_POINTAWHITE 56
+#define MODELINDEX_POINTBWHITE 57
+#define MODELINDEX_POINTWHITE 58
+#define MODELINDEX_POINTRED 59
+#define MODELINDEX_POINTBLUE 60
+
+
+//
+#define WEAPONINDEX_GAUNTLET 1
+#define WEAPONINDEX_MACHINEGUN 2
+#define WEAPONINDEX_SHOTGUN 3
+#define WEAPONINDEX_GRENADE_LAUNCHER 4
+#define WEAPONINDEX_ROCKET_LAUNCHER 5
+#define WEAPONINDEX_LIGHTNING 6
+#define WEAPONINDEX_RAILGUN 7
+#define WEAPONINDEX_PLASMAGUN 8
+#define WEAPONINDEX_BFG 9
+#define WEAPONINDEX_GRAPPLING_HOOK 10
+#define WEAPONINDEX_NAILGUN 11
+#define WEAPONINDEX_PROXLAUNCHER 12
+#define WEAPONINDEX_CHAINGUN 13
diff --git a/base/botfiles/items.c b/base/botfiles/items.c
new file mode 100644
index 00000000..a088656a
--- /dev/null
+++ b/base/botfiles/items.c
@@ -0,0 +1,738 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define NOITEM 0
+#define AMMOI 1
+#define WEAPONI 2
+#define HEALTHI 3
+#define ARMORI 4
+#define POWERI 5
+#define FLAGI 6
+#define ROAMI 7
+
+//===================================
+// ARMOR
+//===================================
+
+iteminfo "ammo_belt"
+{
+name "Chaingun Belt"
+model "models/powerups/ammo/chaingunam.md3"
+modelindex MODELINDEX_BELT
+type AMMOI
+index INVENTORY_BELT
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_bfg"
+{
+name "Bfg ammo"
+model "models/powerups/ammo/bfgam.md3"
+modelindex MODELINDEX_BFGAMMO
+type AMMOI
+index INVENTORY_BFGAMMO
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_bullets"
+{
+name "Bullets"
+model "models/powerups/ammo/machinegunam.md3"
+modelindex MODELINDEX_BULLETS
+type AMMOI
+index INVENTORY_BULLETS
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_cells"
+{
+name "Cells"
+model "models/powerups/ammo/plasmaam.md3"
+modelindex MODELINDEX_CELLS
+type AMMOI
+index INVENTORY_CELLS
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_grenades"
+{
+name "Grenades"
+model "models/powerups/ammo/grenadeam.md3"
+modelindex MODELINDEX_GRENADES
+type AMMOI
+index INVENTORY_GRENADES
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_lightning"
+{
+name "Lightning"
+model "models/powerups/ammo/lightningam.md3"
+modelindex MODELINDEX_LIGHTNINGAMMO
+type AMMOI
+index INVENTORY_LIGHTNINGAMMO
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_mines"
+{
+name "Proximity Mines"
+model "models/powerups/ammo/proxmineam.md3"
+modelindex MODELINDEX_MINES
+type AMMOI
+index INVENTORY_MINES
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_nails"
+{
+name "Nails"
+model "models/powerups/ammo/nailgunam.md3"
+modelindex MODELINDEX_NAILS
+type AMMOI
+index INVENTORY_NAILS
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_rockets"
+{
+name "Rockets"
+model "models/powerups/ammo/rocketam.dm3"
+modelindex MODELINDEX_ROCKETS
+type AMMOI
+index INVENTORY_ROCKETS
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_shells"
+{
+name "Shells"
+model "models/powerups/ammo/shotgunam.md3"
+modelindex MODELINDEX_SHELLS
+type AMMOI
+index INVENTORY_SHELLS
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "ammo_slugs"
+{
+name "Slugs"
+model "models/powerups/ammo/railgunam.md3"
+modelindex MODELINDEX_SLUGS
+type AMMOI
+index INVENTORY_SLUGS
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "holdable_invulnerability"
+{
+name "Invulnerability"
+model "models/powerups/holdable/invulnerability.md3"
+modelindex MODELINDEX_INVULNERABILITY
+type POWERI
+index INVENTORY_PORTAL
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "holdable_kamikaze"
+{
+name "Kamikaze"
+model "models/powerups/kamikazi.md3"
+modelindex MODELINDEX_KAMIKAZE
+type POWERI
+index INVENTORY_KAMIKAZE
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "holdable_medkit"
+{
+name "Medkit"
+model "models/powerups/holdable/medkit.md3"
+modelindex MODELINDEX_MEDKIT
+type HEALTHI
+index INVENTORY_MEDKIT
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "holdable_portal"
+{
+name "Portal"
+model "models/powerups/holdable/teleporter.md3"
+modelindex MODELINDEX_PORTAL
+type POWERI
+index INVENTORY_PORTAL
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "holdable_teleporter"
+{
+name "Personal Teleporter"
+model "models/powerups/holdable/teleporter.md3"
+modelindex MODELINDEX_TELEPORTER
+type POWERI
+index INVENTORY_TELEPORTER
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_armor_body"
+{
+name "Heavy Armor"
+model "models/powerups/armor/armor_red.md3"
+modelindex MODELINDEX_ARMORBODY
+type ARMORI
+index INVENTORY_ARMOR
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "item_armor_combat"
+{
+name "Armor"
+model "models/powerups/armor/armor_yel.md3"
+modelindex MODELINDEX_ARMORCOMBAT
+type ARMORI
+index INVENTORY_ARMOR
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_armor_shard"
+{
+name "Armor Shard"
+model "models/powerups/armor/shard.md3"
+modelindex MODELINDEX_ARMORSHARD
+type ARMORI
+index INVENTORY_ARMOR
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "item_health"
+{
+name "25 Health"
+model "models/powerups/health/medium_cross.md3"
+modelindex MODELINDEX_HEALTH
+type HEALTHI
+index INVENTORY_HEALTH
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_health_large"
+{
+name "50 Health"
+model "models/powerups/health/large_cross.md3"
+modelindex MODELINDEX_HEALTHLARGE
+type HEALTHI
+index INVENTORY_HEALTH
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_health_mega"
+{
+name "Mega Health"
+model "models/powerups/health/mega_cross.md3"
+modelindex MODELINDEX_HEALTHMEGA
+type HEALTHI
+index INVENTORY_HEALTH
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "item_health_small"
+{
+name "5 Health"
+model "models/powerups/health/small_cross.md3"
+modelindex MODELINDEX_HEALTHSMALL
+type HEALTHI
+index INVENTORY_HEALTH
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "weapon_bfg_mp"
+{
+name "BFG10K"
+model "models/weapons2/bfg/bfg.md3"
+modelindex MODELINDEX_BFG10K
+type WEAPONI
+index INVENTORY_BFG10K
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "weapon_chaingun"
+{
+name "Chaingun"
+model "models/weapons/vulcan/vulcan.md3"
+modelindex MODELINDEX_CHAINGUN
+type WEAPONI
+index INVENTORY_CHAINGUN
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "weapon_fists"
+{
+name "Gauntlet"
+model "models/weapons2/gauntlet/gauntlet.md3"
+modelindex MODELINDEX_GAUNTLET
+type WEAPONI
+index INVENTORY_GAUNTLET
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "weapon_grapplinghook"
+{
+name "Grappling Hook"
+model ""
+modelindex MODELINDEX_GRAPPLINGHOOK
+type WEAPONI
+index INVENTORY_GRAPPLINGHOOK
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "weapon_grenadelauncher"
+{
+name "Grenade Launcher"
+model "models/weapons2/grenadel/grenadel.md2"
+modelindex MODELINDEX_GRENADELAUNCHER
+type WEAPONI
+index INVENTORY_GRENADELAUNCHER
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "weapon_lightning"
+{
+name "Lightning Gun"
+model "models/weapons2/lightning/lightning.md3"
+modelindex MODELINDEX_LIGHTNING
+type WEAPONI
+index INVENTORY_LIGHTNING
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "weapon_machinegun"
+{
+name "Machinegun"
+model "models/weapons2/machinegun/machinegun.md3"
+modelindex MODELINDEX_MACHINEGUN
+type WEAPONI
+index INVENTORY_MACHINEGUN
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "weapon_shotgun_mp"
+{
+name "Shotgun"
+model "models/weapons2/shotgun/shotgun.md3"
+modelindex MODELINDEX_SHOTGUN
+type WEAPONI
+index INVENTORY_SHOTGUN
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "weapon_railgun"
+{
+name "Railgun"
+model "models/weapons2/railgun/railgun.md3"
+modelindex MODELINDEX_RAILGUN
+type WEAPONI
+index INVENTORY_RAILGUN
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "weapon_rocketlauncher_mp"
+{
+name "Rocket Launcher"
+model "models/weapons2/rocketl/rocketl.md3"
+modelindex MODELINDEX_ROCKETLAUNCHER
+type WEAPONI
+index INVENTORY_ROCKETLAUNCHER
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "weapon_nailgun"
+{
+name "Nailgun"
+model "models/weapons/nailgun/nailgun.md3"
+modelindex MODELINDEX_NAILGUN
+type WEAPONI
+index INVENTORY_NAILGUN
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "weapon_plasmagun_mp"
+{
+name "Plasma Gun"
+model "models/weapons2/plasma/plasma.md3"
+modelindex MODELINDEX_PLASMAGUN
+type WEAPONI
+index INVENTORY_PLASMAGUN
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+iteminfo "weapon_prox_launcher"
+{
+name "Prox Launcher"
+model "models/weapons/proxmine/proxmine.md3"
+modelindex MODELINDEX_PROXLAUNCHER
+type WEAPONI
+index INVENTORY_PROXLAUNCHER
+respawntime 30
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+
+
+
+
+iteminfo "item_quad"
+{
+name "Quad Damage"
+model "models/powerups/instant/quad.md3"
+modelindex MODELINDEX_QUAD
+type POWERI
+index INVENTORY_QUAD
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_enviro"
+{
+name "Battle Suit"
+model "models/powerups/instant/enviro.md3"
+modelindex MODELINDEX_ENVIRONMENTSUIT
+type POWERI
+index INVENTORY_ENVIRONMENTSUIT
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_haste"
+{
+name "Speed"
+model "models/powerups/instant/haste_ring.md3"
+modelindex MODELINDEX_HASTE
+type POWERI
+index INVENTORY_HASTE
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_invisibility"
+{
+name "Invisibility"
+model "models/powerups/instant/invis.md3"
+modelindex MODELINDEX_INVISIBILITY
+type POWERI
+index INVENTORY_INVISIBILITY
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_regen"
+{
+name "Regeneration"
+model "models/powerups/instant/regen_ring.md3"
+modelindex MODELINDEX_REGEN
+type POWERI
+index INVENTORY_REGEN
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_flight"
+{
+name "Flight"
+model "models/powerups/instant/flight_ring.md3"
+modelindex MODELINDEX_FLIGHT
+type POWERI
+index INVENTORY_FLIGHT
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_scout"
+{
+name "Scout"
+model "models/powerups/scout.md3"
+modelindex MODELINDEX_SCOUT
+type POWERI
+index INVENTORY_SCOUT
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_guard"
+{
+name "Guard"
+model "models/powerups/guard.md3"
+modelindex MODELINDEX_GUARD
+type POWERI
+index INVENTORY_GUARD
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_doubler"
+{
+name "Doubler"
+model "models/powerups/doubler.md3"
+modelindex MODELINDEX_DOUBLER
+type POWERI
+index INVENTORY_DOUBLER
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_ammoregen"
+{
+name "Ammo Regen"
+model "models/powerups/ammo.md3"
+modelindex MODELINDEX_AMMOREGEN
+type POWERI
+index INVENTORY_AMMOREGEN
+respawntime 60
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "team_CTF_redflag"
+{
+name "Red Flag"
+model "models/flags/r_flag.md3"
+modelindex MODELINDEX_REDFLAG
+type FLAGI
+index INVENTORY_REDFLAG
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "team_CTF_blueflag"
+{
+name "Blue Flag"
+model "models/flags/b_flag.md3"
+modelindex MODELINDEX_BLUEFLAG
+type FLAGI
+index INVENTORY_BLUEFLAG
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "team_CTF_neutralflag"
+{
+name "Neutral Flag"
+model "models/flags/n_flag.md3"
+modelindex MODELINDEX_NEUTRALFLAG
+type FLAGI
+index INVENTORY_NEUTRALFLAG
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "team_redobelisk"
+{
+name "Red Obelisk"
+model "models/powerups/obelisk/obelisk.md3"
+modelindex 0
+type NOITEM
+index 0
+mins {-14, -14, 1}
+maxs {14, 14, 87}
+}
+
+iteminfo "team_blueobelisk"
+{
+name "Blue Obelisk"
+model "models/powerups/obelisk/obelisk.md3"
+modelindex 0
+type NOITEM
+index 0
+mins {-14, -14, 1}
+maxs {14, 14, 87}
+}
+
+iteminfo "team_neutralobelisk"
+{
+name "Neutral Obelisk"
+model "models/powerups/obelisk/obelisk.md3"
+modelindex 0
+type NOITEM
+index 0
+mins {-14, -14, 1}
+maxs {14, 14, 87}
+}
+
+iteminfo "item_redcube"
+{
+name "Red Cube"
+model "models/powerups/orb/r_orb.md3"
+modelindex MODELINDEX_REDCUBE
+type FLAGI
+index INVENTORY_REDCUBE
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_bluecube"
+{
+name "Blue Cube"
+model "models/powerups/orb/b_orb.md3"
+modelindex MODELINDEX_BLUECUBE
+type FLAGI
+index INVENTORY_BLUECUBE
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "item_botroam"
+{
+name "Bot Roam Goal"
+model ""
+modelindex 0
+type ROAMI
+index 0
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+//Domination points:
+iteminfo "team_dom_pointWhite"
+{
+name "Neutral domination point"
+model "models/dpoints/a_white.md3"
+modelindex MODELINDEX_POINTWHITE
+type FLAGI
+index INVENTORY_POINTWHITE
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "team_dom_pointBlue"
+{
+name "Blue domination point"
+model "models/dpoints/a_blue.md3"
+modelindex MODELINDEX_POINTBLUE
+type FLAGI
+index INVENTORY_POINTBLUE
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
+iteminfo "team_dom_pointRed"
+{
+name "Red domination point"
+model "models/dpoints/a_red.md3"
+modelindex MODELINDEX_POINTRED
+type FLAGI
+index INVENTORY_POINTRED
+mins {-13,-13,-13}
+maxs {13,13,13}
+}
+
diff --git a/base/botfiles/match.c b/base/botfiles/match.c
new file mode 100644
index 00000000..836e7ad9
--- /dev/null
+++ b/base/botfiles/match.c
@@ -0,0 +1,332 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "match.h"
+
+#define PURE_CRAP 2
+#define MORE_CRAP 2
+
+
+
+// this is rare but people can always fuckup
+// don't use EC"(", EC")", EC"[", EC"]" or EC":" inside player names
+// don't use EC": " inside map locations
+
+//entered the game message
+MTCONTEXT_MISC
+{
+
+ NETNAME, " has joined the game" = (MSG_ENTERGAME, 0);
+ NETNAME, " is the team leader" = (MSG_NEWLEADER, 0);
+}
+
+//team command chat messages
+MTCONTEXT_INITIALTEAMCHAT
+{
+ //help and/or meet someone
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": help "|" meet ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_HELP, ST_NEARITEM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": help "|" meet ", TEAMMATE = (MSG_HELP, ST_SOMEWHERE);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " help "|" meet ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_HELP, $evalint(ST_NEARITEM|ST_ADDRESSED));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " help "|" meet ", TEAMMATE = (MSG_HELP, $evalint(ST_SOMEWHERE|ST_ADDRESSED));
+
+ //accompany someone (and meet at the rendezvous point) ("hunk follow me", "hunk go with babe", etc.)
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go with "|"follow "|"cover "|" protect ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM, " for", TIME = (MSG_ACCOMPANY, $evalint(ST_NEARITEM|ST_TIME));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go with "|"follow "|"cover "|" protect ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_ACCOMPANY, ST_NEARITEM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go with "|"follow "|"cover "|" protect ", TEAMMATE, " for", TIME = (MSG_ACCOMPANY, $evalint(ST_SOMEWHERE|ST_TIME));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go with "|"follow "|"cover "|" protect ", TEAMMATE = (MSG_ACCOMPANY, ST_SOMEWHERE);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go with "|" follow "|" cover "|" protect ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM, " for", TIME = (MSG_ACCOMPANY, $evalint(ST_NEARITEM|ST_ADDRESSED|ST_TIME));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go with "|" follow "|" cover "|" protect ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_ACCOMPANY, $evalint(ST_NEARITEM|ST_ADDRESSED));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go with "|" follow "|" cover "|" protect ", TEAMMATE, " for", TIME = (MSG_ACCOMPANY, $evalint(ST_SOMEWHERE|ST_ADDRESSED|ST_TIME));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go with "|" follow "|" cover "|" protect ", TEAMMATE = (MSG_ACCOMPANY, $evalint(ST_SOMEWHERE|ST_ADDRESSED));
+
+ //preference
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to ", "be "|"", "on "|"", "defense"|"defend" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to capture ", "the "|"their ", "Red Flag"|"Blue Flag"|"flag" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to ", "get "|"capture ", "the "|"their ", "Red Flag"|"Blue Flag"|"flag" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to ", "attack"|"assault" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to harvest", " skulls"|" cubes"|"" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to be ", "on "|"", "offense" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will defend", ""|"the base"|"the flag"|"the obelisk" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will not harvest", " skulls"|" cubes"|"" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I am ", "on "|"", "defense" = (MSG_TASKPREFERENCE, ST_DEFENDER);
+
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will not defend", ""|"the flag"|"the base"|"the obelisk" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I do not want to be ", "on "|"", "defense" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to get ", "the "|"their", "Red Flag"|"Blue Flag"|"flag" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to ", "attack"|"assault", ""|" the "|"their ", "Red Flag"|"Blue Flag"|"Red Obelisk"|"Blue Obelisk"|"base"|"" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to harvest", " skulls"|" cubes"|"" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to be ", "on "|"", "offense" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will ", "attack"|"assault", ""|" the "|" their ", "Red Obelisk"|"Blue Obelisk"|"base"|"" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will be ", "on "|"", "offense" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I will harvest", " skulls"|" cubes"|"" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I am ", "on "|"", "offense" = (MSG_TASKPREFERENCE, ST_ATTACKER);
+
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I want to roam" = (MSG_TASKPREFERENCE, ST_ROAMER);
+
+
+ //get the flag
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": capture ", "the blue "|"the enemy "|"the red "|"their "|"the "|"enemy ", "flag" = (MSG_GETFLAG, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": get ", "the blue "|"the red "|"the enemy "|"their "|"the "|"enemy ", "flag" = (MSG_GETFLAG, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " capture ", "the blue "|"the enemy"|"the red "|"their "|"the "|"enemy ", "flag" = (MSG_GETFLAG, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " get ", "the blue "|"the enemy"|"the red "|"their "|"the "|"enemy ", "flag" = (MSG_GETFLAG, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": get ", PURE_CRAP, " flag ", MORE_CRAP = (MSG_GETFLAG, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": kill the flag carrier" = (MSG_GETFLAG, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": kill the flag" = (MSG_GETFLAG, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " kill the flag carrier" = (MSG_GETFLAG, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " kill the flag" = (MSG_GETFLAG, ST_ADDRESSED);
+
+ //attack the enemy base
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " attack ", "enemy "|"the enemy "|"the red "|"the blue "|"their ", "base"|"flag"|"obelisk" = (MSG_ATTACKENEMYBASE, ST_ADDRESSED);
+
+ //go harvesting
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " harvest" = (MSG_HARVEST, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go harvesting" = (MSG_HARVEST, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " collect ","skulls"|"cubes" = (MSG_HARVEST, ST_ADDRESSED);
+
+
+
+ //kill someone (NOTE: make sure these are after the get flag match templates because of the "kill"
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": kill ", ENEMY = (MSG_KILL, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " kill ", ENEMY = (MSG_KILL, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wack ", ENEMY = (MSG_KILL, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " take out ", ENEMY = (MSG_KILL, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": hunt down ", ENEMY = (MSG_KILL, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": kill ", ENEMY = (MSG_KILL, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": wack ", ENEMY = (MSG_KILL, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": take out ", ENEMY = (MSG_KILL, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": death to ", ENEMY = (MSG_KILL, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " hunt down ", ENEMY = (MSG_KILL, ST_ADDRESSED);
+
+ //get item
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " grab the "|" go grab the ", ITEM = (MSG_GETITEM, ST_ADDRESSED);
+
+
+ //defend/guard a key area
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "defend "|"guard ", "the checkpoint "|"the waypoint ", KEYAREA, " for", TIME = (MSG_DEFENDKEYAREA, ST_TIME);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "defend "|"guard ", "the checkpoint "|"the waypoint ", KEYAREA = (MSG_DEFENDKEYAREA, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " defend "|" guard ", "the ", "checkpoint "|"waypoint ", KEYAREA, " for", TIME = (MSG_DEFENDKEYAREA, $evalint(ST_ADDRESSED|ST_TIME));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " defend "|" guard ", "the checkpoint "|"the waypoint ", KEYAREA = (MSG_DEFENDKEYAREA, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " defend the "|" guard the ", KEYAREA = (MSG_DEFENDKEYAREA, ST_ADDRESSED);
+
+ //camp somewhere ("hunk camp here", "hunk camp there", "hunk camp near the rl", etc.)
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "there "|"over there ", " for", TIME = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_TIME|ST_THERE));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "there"|"over there" = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_THERE));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "here"|"over here ", " for", TIME = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_TIME|ST_HERE));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "here"|"over here" = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_HERE));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "near "|"at "|"", "the "|"checkpoint "|"waypoint ", KEYAREA, " for", TIME = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_NEARITEM|ST_TIME));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " camp ", "near "|"at ", "the checkpoint "|"the waypoint ", KEYAREA = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_NEARITEM));
+ //go to (same as camp)
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go to ", "the "|"checkpoint "|"waypoint ", KEYAREA = (MSG_CAMP, $evalint(ST_ADDRESSED|ST_NEARITEM));
+
+ //Double Domination orders
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "take"|"dominate"|"hold", " point A"|" red base" = (MSG_TAKEA, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "take"|"dominate"|"hold", " point B"|" blue base" = (MSG_TAKEB, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " take"|" dominate"|" hold", " point A"|"red base" = (MSG_TAKEA, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " take"|" dominate"|" hold", " point B"|"blue base" = (MSG_TAKEB, ST_ADDRESSED);
+
+ //rush to the base in CTF
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " rush ", "to "|"to the "|"the ", "base" = (MSG_RUSHBASE, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " go ", "to"|"to the", " base" = (MSG_RUSHBASE, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "rush base" = (MSG_RUSHBASE, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "return to base" = (MSG_RUSHBASE, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "go to base" = (MSG_RUSHBASE, 0);
+
+ //return the flag
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " return ", PURE_CRAP, " flag" = (MSG_RETURNFLAG, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": return ", MORE_CRAP, " flag", PURE_CRAP = (MSG_RETURNFLAG, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": return the", MESSAGE, " flag", PURE_CRAP = (MSG_RETURNFLAG, 0);
+
+
+ //who is the team leader
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": who is ", "the leader"|"the team leader"|"team leader"|"leader", "?"|"" = (MSG_WHOISTEAMLAEDER, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": is there a ", "leader"|"team leader", "?"|"" = (MSG_WHOISTEAMLAEDER, 0);
+
+ //become the team leader
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " will be ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " want to be ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " wants to be ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " is ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " you are ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " will be ", THE_TEAM, "leader" = (MSG_STARTTEAMLEADERSHIP, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I am ", "the leader"|"the team leader"|"team leader"|"leader" = (MSG_STARTTEAMLEADERSHIP, ST_I);
+
+
+ //stop being the team leader
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", TEAMMATE, " is not ", THE_TEAM, "leader" = (MSG_STOPTEAMLEADERSHIP, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "I quit being leader"|"I no longer lead"|"i stop being the leader" = (MSG_STOPTEAMLEADERSHIP, ST_I);
+
+
+ //wait for someone
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wait for me", " near "|" at ", "the "|"checkpoint "|"waypoint ", ITEM = (MSG_WAIT, $evalint(ST_NEARITEM|ST_ADDRESSED|ST_I));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wait for me" = (MSG_WAIT, $evalint(ST_SOMEWHERE|ST_ADDRESSED|ST_I));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wait for ", TEAMMATE, " near "|" at ", "the "|"checkpoint "|"waypoint "|"", ITEM = (MSG_WAIT, $evalint(ST_NEARITEM|ST_ADDRESSED));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " wait for ", TEAMMATE = (MSG_WAIT, $evalint(ST_SOMEWHERE|ST_ADDRESSED));
+
+ //ask what someone/everyone is doing
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " report" = (MSG_WHATAREYOUDOING, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": report" = (MSG_WHATAREYOUDOING, 0);
+
+
+ //ask the team leader what to do
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": what is my command", "?"|"" = (MSG_WHATISMYCOMMAND, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": what should I do", "?"|"" = (MSG_WHATISMYCOMMAND, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": what am I supposed to do", "?"|"" = (MSG_WHATISMYCOMMAND, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": what is my job", "?"|"" = (MSG_WHATISMYCOMMAND, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what is my command", "?"|"" = (MSG_WHATISMYCOMMAND, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what should I do", "?"|"" = (MSG_WHATISMYCOMMAND, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what am I supposed to do", "?"|"" = (MSG_WHATISMYCOMMAND, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what is my job", "?"|"" = (MSG_WHATISMYCOMMAND, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": orders", "?"|"" = (MSG_WHATISMYCOMMAND, 0);
+
+ //ask where someone or everyone is
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " where are you", "?"|"" = (MSG_WHEREAREYOU, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": where are you ", ADDRESSEE, "?"|"" = (MSG_WHEREAREYOU, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": where is ", ADDRESSEE, "?"|"" = (MSG_WHEREAREYOU, ST_ADDRESSED);
+
+ //join a sub team
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " create squad ", TEAMNAME = (MSG_JOINSUBTEAM, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " join squad ", TEAMNAME = (MSG_JOINSUBTEAM, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " you"|" we", " are in", " squad ", TEAMNAME = (MSG_JOINSUBTEAM, ST_ADDRESSED);
+
+ //leave a sub team
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " leave your squad" = (MSG_LEAVESUBTEAM, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " disband" = (MSG_LEAVESUBTEAM, ST_ADDRESSED);
+
+ //what team are you in
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " which "|" what ", "squad", " are you ", "in"|"on", "?"|"" = (MSG_WHICHTEAM, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " what is your ", "squad","?"|"" = (MSG_WHICHTEAM, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " are you ", "in"|"on", " a squad","?"|"" = (MSG_WHICHTEAM, ST_ADDRESSED);
+
+ //dismiss
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " stop action"|" roam"|" dismissed" = (MSG_DISMISS, ST_ADDRESSED);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "cancel order"|"roam" = (MSG_DISMISS, 0);
+
+ //remember checkpoint
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", "checkpoint "|"waypoint ", NAME, " is at ", POSITION = (MSG_CHECKPOINT, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " checkpoint "|" waypoint ", NAME, " is at ", POSITION = (MSG_CHECKPOINT, ST_ADDRESSED);
+
+ //patrol
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": patrol ", "from "|"", KEYAREA, " for", TIME = (MSG_PATROL, ST_TIME);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": patrol ", "from "|"", KEYAREA = (MSG_PATROL, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " patrol ", "from "|"", KEYAREA, " for", TIME = (MSG_PATROL, $evalint(ST_ADDRESSED|ST_TIME));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " patrol ", "from "|"", KEYAREA = (MSG_PATROL, ST_ADDRESSED);
+
+
+ //lead the way
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": lead the way" = (MSG_LEADTHEWAY, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I'll follow" = (MSG_LEADTHEWAY, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": lead the way ", ADDRESSEE = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": I'll follow ", ADDRESSEE = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " lead the way" = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": lead ", TEAMMATE, " around ", ADDRESSEE = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED|ST_SOMEONE));
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " lead ", TEAMMATE, "" = (MSG_LEADTHEWAY, $evalint(ST_ADDRESSED|ST_SOMEONE));
+
+ // suicide
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": suicide" = (MSG_SUICIDE, 0);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, EC": ", ADDRESSEE, " suicide" = (MSG_SUICIDE, $evalint(ST_ADDRESSED));
+
+ //anti-bigot bot suicide code (I hope I am not acting as the thought police...)
+
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, " nigger "|" nigr "|" niger "|"wop"|"macaca"|"monkey", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "kyke"|"kykes"|"kike"|"kikes"|"jewish pig"|"judan"|"jews"|"jew"|"jew lover"|"ex-slaves"|"slaves"|"slave"|"ex-slave"|"xslave"|"xslaves"|"red sea pedestrians"|"red sea pedestrian", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "niggers"|"nigrs"|"nigers"|"wops"|"macacas", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "rag head"|"raghead"|"rag-head"|"camel jockey"|"cml jky"|"cmljky", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "rag heads"|"ragheads"|"rag-heads"|"camel jokeys"|"cml jkys"|"cmljkys", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "towel head"|"towel heads"|"towel-head"|"towel-heads"|"towelhead"|"towelheads", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "homo"|"gay"|"gaygrrl"|"gaygirl"|"faggit"|"gay-girl"|"gay-grrl", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "faggot"|"fagit"|"fagot"|"queer"|"gayboy"|"gayboi", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "dyke"|"dike"|"lez"|"les"|"lezbo"|"lesbo"|"fags"|"fagz", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "homos"|"dykes"|"dikes"|"lesbos"|"lezbos"|"fagots"|"faggots"|"faggits"|"fagits", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "sand-nigger"|"sand-niger"|"sndngr"|"sand-niggers"|"sand-nigers"|"sndngrs", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "red skins"|"red-skins"|"braves"|"chiefs"|"red skin"|"red-skin"|"chief", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "bean-picker"|"bean picker"|"beanpicker"|"wet back"|"wetback"|"wet-back", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", "bean-pickers"|"beanpickers"|"bean pickers"|"wet backs"|"wetbacks"|"wet-backs", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "spook"|"gook"|"slant"|"mamasan", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ EC"("|EC"[", NETNAME, EC")"|EC"]", PLACE, "spooks"|"gooks"|"slants"|"mamasans"|"hitler", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ // not a good solution but it does work in certain situations...
+ NETNAME, EC": ", MORE_CRAP, "sand-nigger"|"sand-niger"|"sndngr"|"sand-niggers"|"sand-nigers"|" sndngrs ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, "red skins"|"red-skins"|" braves "|" chiefs "|"red skin"|" red-skin "|" chief ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " bean-picker "|" bean picker "|" beanpicker "|"wet back"|" wetback "|"wet-back", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " bean-pickers "|" beanpickers "|"bean pickers"|"wet backs"|" wetbacks "|"wet-backs", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " spook "|" gook "|" slant "|" mamasan ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " spooks "|" gooks "|" slants "|" mamasans ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " homo "|" gay "|" gaygrrl "|" gaygirl "|" gay-girl "|" gay-grrl "|" faggit ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " faggot "|" fagit "|" fagot "|" queer "|" gayboy "|" gayboi ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " dyke "|" dike "|" lez "|" les "|" lezbo "|" lesbo "|" fags "|" fagz ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " homos "|" dykes "|" dikes "|" lesbos "|" lezbos "|" faggots "|" fagots "|" faggits "|" fagits ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " rag head"|" raghead"|" rag-head"|" camel jockey"|" cml jky"|" cmljky", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " rag heads"|" ragheads "|" rag-heads"|" camel jokeys"|" cml jkys", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " towel head"|" towel heads"|" towel-head"|" towel-heads"|" towelhead"|" towelheads", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " nigrs "|" nigers "|"wops"|" macacas ", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " kyke "|" kykes "|" kike "|" kikes "|"jewish pig"|"judan"|" jew "|" jews "|"jew lover"|"ex-slaves"|"slaves"|"slave"|"ex-slave"|"xslave"|"xslaves"|"red sea pedestrians"|"red sea pedestrian", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+ NETNAME, EC": ", MORE_CRAP, " nigger"|" nigr "|" niger "|"wop"|" macaca "|" monkey"|" hitler", PURE_CRAP = (MSG_SUICIDE, ST_TEAM);
+
+}
+
+MTCONTEXT_CTF
+{
+ NETNAME, " got the ", FLAG, " flag", "!"|"" = (MSG_CTF, ST_GOTFLAG);
+ NETNAME, " captured the ", FLAG, " flag", "!"|"" = (MSG_CTF, ST_CAPTUREDFLAG);
+ NETNAME, " returned the ", FLAG, " flag", "!"|"" = (MSG_CTF, ST_RETURNEDFLAG);
+ //for One Flag CTF
+ NETNAME, " got the flag", "!"|"" = (MSG_CTF, ST_1FCTFGOTFLAG);
+}
+
+MTCONTEXT_TIME
+{
+ TIME, " minute"|" min","s"|"" = (MSG_MINUTES, 0);
+ TIME, " second"|" sec","s"|"" = (MSG_SECONDS, 0);
+ "ever" = (MSG_FOREVER, 0);
+ " a long time" = (MSG_FORALONGTIME, 0);
+ " a while" = (MSG_FORAWHILE, 0);
+}
+
+MTCONTEXT_PATROLKEYAREA
+{
+ "the "|"checkpoint "|"waypoint "|"", KEYAREA, " to "|" and ", MORE = (MSG_PATROLKEYAREA, ST_MORE);
+ "the "|"checkpoint "|"waypoint "|"", KEYAREA, " and loop"|" and back", " to the start"|"" = (MSG_PATROLKEYAREA, ST_BACK);
+ "the "|"checkpoint "|"waypoint "|"", KEYAREA, " and reverse" = (MSG_PATROLKEYAREA, ST_REVERSE);
+ "the "|"checkpoint "|"waypoint "|"", KEYAREA = (MSG_PATROLKEYAREA, 0);
+}
+
+MTCONTEXT_TEAMMATE
+{
+ "me"|"I" = (MSG_ME, 0);
+}
+
+MTCONTEXT_ADDRESSEE
+{
+ "Everyone"|"Everybody" = (MSG_EVERYONE, 0);
+ TEAMMATE, " and "|", "|","|" ,", MORE = (MSG_MULTIPLENAMES, 0);
+ TEAMMATE = (MSG_NAME, 0);
+}
+
+MTCONTEXT_REPLYCHAT
+{
+ EC"(", NETNAME, EC")", PLACE, EC": ", MESSAGE = (MSG_CHATTEAM, 0);
+ EC"[", NETNAME, EC"]", PLACE, EC": ", MESSAGE = (MSG_CHATTELL, 0);
+ // included for peace of mind
+ NETNAME, EC": ", MESSAGE = (MSG_CHATALL, 0);
+}
+
diff --git a/base/botfiles/match.h b/base/botfiles/match.h
new file mode 100644
index 00000000..d3f17105
--- /dev/null
+++ b/base/botfiles/match.h
@@ -0,0 +1,138 @@
+/*
+===========================================================================
+Copyright (C) 1999-2005 Id Software, Inc.
+
+This file is part of Quake III Arena source code.
+
+Quake III Arena source code is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Quake III Arena source code is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+// make sure this is the same character as we use in chats in g_cmd.c
+#define EC "\x19"
+
+//match template contexts
+#define MTCONTEXT_MISC 2
+#define MTCONTEXT_INITIALTEAMCHAT 4
+#define MTCONTEXT_TIME 8
+#define MTCONTEXT_TEAMMATE 16
+#define MTCONTEXT_ADDRESSEE 32
+#define MTCONTEXT_PATROLKEYAREA 64
+#define MTCONTEXT_REPLYCHAT 128
+#define MTCONTEXT_CTF 256
+
+//message types
+#define MSG_NEWLEADER 1 //new leader
+#define MSG_ENTERGAME 2 //enter game message
+#define MSG_HELP 3 //help someone
+#define MSG_ACCOMPANY 4 //accompany someone
+#define MSG_DEFENDKEYAREA 5 //defend a key area
+#define MSG_RUSHBASE 6 //everyone rush to base
+#define MSG_GETFLAG 7 //get the enemy flag
+#define MSG_STARTTEAMLEADERSHIP 8 //someone wants to become the team leader
+#define MSG_STOPTEAMLEADERSHIP 9 //someone wants to stop being the team leader
+#define MSG_WHOISTEAMLAEDER 10 //who is the team leader
+#define MSG_WAIT 11 //wait for someone
+#define MSG_WHATAREYOUDOING 12 //what are you doing?
+#define MSG_JOINSUBTEAM 13 //join a sub-team
+#define MSG_LEAVESUBTEAM 14 //leave a sub-team
+#define MSG_CREATENEWFORMATION 15 //create a new formation
+#define MSG_FORMATIONPOSITION 16 //tell someone his/her position in a formation
+#define MSG_FORMATIONSPACE 17 //set the formation intervening space
+#define MSG_DOFORMATION 18 //form a known formation
+#define MSG_DISMISS 19 //dismiss commanded team mates
+#define MSG_CAMP 20 //camp somewhere
+#define MSG_CHECKPOINT 21 //remember a check point
+#define MSG_PATROL 22 //patrol between certain keypoints
+#define MSG_LEADTHEWAY 23 //lead the way
+#define MSG_GETITEM 24 //get an item
+#define MSG_KILL 25 //kill someone
+#define MSG_WHEREAREYOU 26 //where is someone
+#define MSG_RETURNFLAG 27 //return the flag
+#define MSG_WHATISMYCOMMAND 28 //ask the team leader what to do
+#define MSG_WHICHTEAM 29 //ask which team a bot is in
+#define MSG_TASKPREFERENCE 30 //tell your teamplay task preference
+#define MSG_ATTACKENEMYBASE 31 //attack the enemy base
+#define MSG_HARVEST 32 //go harvest
+#define MSG_SUICIDE 33 //order to suicide
+//
+#define MSG_ME 100
+#define MSG_EVERYONE 101
+#define MSG_MULTIPLENAMES 102
+#define MSG_NAME 103
+#define MSG_PATROLKEYAREA 104
+#define MSG_MINUTES 105
+#define MSG_SECONDS 106
+#define MSG_FOREVER 107
+#define MSG_FORALONGTIME 108
+#define MSG_FORAWHILE 109
+//
+#define MSG_CHATALL 200
+#define MSG_CHATTEAM 201
+#define MSG_CHATTELL 202
+//
+#define MSG_CTF 300 //ctf message
+
+//Double Domination messages
+#define MSG_TAKEA 90
+#define MSG_TAKEB 91
+
+//command sub types
+#define ST_SOMEWHERE 0
+#define ST_NEARITEM 1
+#define ST_ADDRESSED 2
+#define ST_METER 4
+#define ST_FEET 8
+#define ST_TIME 16
+#define ST_HERE 32
+#define ST_THERE 64
+#define ST_I 128
+#define ST_MORE 256
+#define ST_BACK 512
+#define ST_REVERSE 1024
+#define ST_SOMEONE 2048
+#define ST_GOTFLAG 4096
+#define ST_CAPTUREDFLAG 8192
+#define ST_RETURNEDFLAG 16384
+#define ST_TEAM 32768
+#define ST_1FCTFGOTFLAG 65535
+//ctf task preferences
+#define ST_DEFENDER 1
+#define ST_ATTACKER 2
+#define ST_ROAMER 4
+
+
+//word replacement variables
+#define THE_ENEMY 7
+#define THE_TEAM 7
+//team message variables
+#define NETNAME 0
+#define PLACE 1
+#define FLAG 1
+#define MESSAGE 2
+#define ADDRESSEE 2
+#define ITEM 3
+#define TEAMMATE 4
+#define TEAMNAME 4
+#define ENEMY 4
+#define KEYAREA 5
+#define FORMATION 5
+#define POSITION 5
+#define NUMBER 5
+#define TIME 6
+#define NAME 6
+#define MORE 6
+
+
diff --git a/base/botfiles/rchat.c b/base/botfiles/rchat.c
new file mode 100644
index 00000000..cda3ff51
--- /dev/null
+++ b/base/botfiles/rchat.c
@@ -0,0 +1,293 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+["politicians", "politician"] = 7
+{
+ "People should realize that they can govern themselves without the need for elected representation.";
+ "I have no need for elected representation, I govern myself.";
+ "There is no need for leadership here";
+ "Politicians serve their own needs, not those they represent.";
+ "Do you really need someone telling you what you can or cannot do?";
+ "When people are honest there is no need for law or elected representation.";
+ "Elected representation is the basis for all manor of oppression.";
+ ponder;
+}
+
+["no", "not", "Nada", "nope", !"no place", !"no feeling."] = 5
+{
+ "are you sure about that?";
+ "You sound so sure of yourself";
+ "Really?";
+ "Don't be so certain";
+}
+
+["nigger", "nigr", "wop", "kyke", "sandnigger", "sand-nigger", "beanpicker", "wetback", "raghead", "macaca", "monkey", "irish pig", "redskin", "red-skin", "red skin", "diaper head", "bean picker", "cml-jky", "camel-jockey", "ngr", "niggers", "wops", "jews", "sandniggers", "sand-niggers", "beanpickers", "wetbacks", "camel jockeys", "cml jkys", "cml jocky", "dyke", "homo", "queer", "faggot", "fag", "kyke", "kike", "dike", "dyk", "kyk", "chink"] = 1
+{
+ "shut the hell up you ", vicious_insult,".";
+ "bigot";
+ "There is no place for bigotry in the Arena";
+ "you are a ", vicious_insult, ", do us all a favor and die.";
+ "All colors explode the same, ", vicious_insult, ".";
+ "People are people, unfortunately you are an idiot, ", vicious_insult, ".";
+ "This is an equal opportunity frag fest, bigots are not welcome.";
+ "Who taught you to be ignorant?";
+ "Bigotry is learned behavior, please unlearn it.";
+ "Who taught you to hate?";
+ "Why do you hate?";
+ "Has anything you have ever done made your life better?";
+ immaturity01;
+ vicious_insult;
+ curse;
+
+}
+
+["why", !"why not"] = 8
+{
+ "why not?";
+ "because dmn_clown said!";
+ "My ", counselor, " said so.";
+ botnames, " said so.";
+ confused_response;
+ peeps, " said so.";
+}
+
+["what is happening?"] = 1
+{
+ "dork";
+ "dweeb";
+ "putz";
+ "schmuck";
+}
+
+["ha", "LOL", "laugh", "funny"] = 6
+{
+ "I'm not laughing.";
+ "What is so funny?";
+ "That wasn't funny...";
+ "Sorry, I forgot to laugh";
+ immaturity01;
+ "hehe";
+ "That was amusing";
+ "Ok, that was funny";
+ response_insult;
+}
+
+["fishing", !"freak fishing"] = 3
+{
+ "My ", family_member, " was eaten by a blue whale last ", month, ".";
+ "I like to use ", substance, " as bait, but only when it is ", weather, ".";
+ "I'd swear that asian carp can speak ", language, ".";
+ response_insult;
+}
+
+["humiliating", "shamed"] = 3
+{
+ "LOL!";
+ "Hehe... good";
+ "You deserve to be";
+ "Merry x-mas!";
+}
+
+["touch me there"] = 1
+{
+ "That isn't what your ", family_member, " said last night.";
+ "why not?";
+ response_insult;
+}
+
+["why not"] = 6
+{
+ "because ", peeps, " said.";
+ "because I said";
+ "because dmn_clown said so!";
+ "A ", profession, " said so.";
+}
+
+["yes", "sure", "certainly"] = 2
+{
+ confused_response;
+ neutral;
+ "You sound positive.";
+ "You've convinced me.";
+ "Ok";
+
+}
+
+["universal harmony"] = 1
+{
+ "Do your work, then step back... the only path to serenity.";
+ "Practice not-doing, and everything will fall into place.";
+ "If you want to be in accord with the Tao, just do your job and then step back.";
+ "When there is no desire all things are at peace.";
+ "The more you know, the less you understand.";
+}
+
+["Pat Robertson", "Jack Thompson"] = 1
+{
+ "I hear he has a ", substance, " addiction.";
+ "I hear that he was caught in bed with a ", animal, " after smoking ", substance, ".";
+ "Isn't there a video of him humping a ", animal, " on YouTube?";
+ "I got him hooked on ", substance, ".";
+ "I sold him ", food, " laced with ", substance, ".";
+}
+
+["Jesus"] = 1
+{
+ "Jesus hates me.";
+ "Why do you need a human sacrifice to be saved, sounds cannibalistic to me...";
+ "Jesus loves you, but I don't.";
+ "I worship ", peeps, ".";
+ "I bow my head to the holy ", animal, " but only after smoking ", substance, ".";
+ "Religion is business and there is money in sin.";
+ "You want to talk about religion HERE?!?!? Some people...";
+ "Quite a few attrocities have been performed in his name.";
+ "I am an anti-christ.";
+}
+
+["addiction", "addicted to"] = 4
+{
+ "I am addicted to ", peeps, ".";
+ "My ", animal, " likes to huff ", food, ".";
+ "Drugs like ", substance, " rot your brain.";
+ "That can be tough on the people around you.";
+}
+
+[(1, " is a ", 0) &name, !"Grism", !"Gargoyle", !"Dmo", !"Penguin", !"Sarge", !"Grunt"] = 4
+{
+ "That is Mizz ", 0, " to you, ", fighter, ".";
+ "I'm only rude to ", fighter, "s like you.";
+ "You should see me out of the Arena...";
+ "That isn't what your ", family_member, " said last night";
+}
+
+["anarchy"] = 3
+{
+ "Yo soy anarquista";
+ "Yo soy un anticristo";
+ "Yo quiero se anarquia";
+ "Quiero desplazar";
+ "While there is a lower class I am in it";
+ "while there is a criminal element I am of it";
+ "while there is a soul in prison, I am not free";
+ "I have no country to fight for, my country is the earth, and I am a citizen of the world.";
+ "The most heroic word in all languages is revolution.";
+ "Intelligent discontent is the mainspring of civilization. Progress is born of agitation. It is agitation or stagnation.";
+ "How pseudo revolutionary of you...";
+}
+
+["OI"] = 5
+{
+ "OI! OI! OI!";
+}
+
+["fuck"] = 1
+{
+ proposition01;
+ immaturity01;
+}
+
+["shit"] = 1
+{
+ "I hope you washed your hands...";
+ "Eeew... please flush.";
+ immaturity01;
+}
+
+["ass"] = 1
+{
+ immaturity01;
+}
+
+["bots", "bot", !"stupid bot"] = 2
+{
+ "Heh... right!";
+ "Bah! Humbug...";
+ "The politically correct term is 'human exterminator'";
+ "What is that about?";
+ "I frag, therefore I am.";
+}
+
+["stupid bot"] = 5
+{
+ "Yeah, bots are stupid.";
+ "Man, why do they even bother with ai, it never works?";
+ "Hey! Blame the person that programmed me!";
+ "What are you trying to say, Dave?";
+}
+
+["sex", "coitis", "sexual intercourse"] = 2
+{
+ "Now?!?";
+ "No thanks, I have a headache.";
+ "You want to talk about that here?";
+ "This is not a chat room!";
+ proposition01;
+ "perv";
+}
+
+[(1, " is a ", 0) &name, !"Kyonshi", !"Major", !"Hnt", !"Dark", !"Tanisha", !"Rai", !"Slshish"] = 4
+{
+ "That is Mr. ", 0, " to you, ", fighter, ".";
+ "I'm only rude to ", fighter, "s like you.";
+ "You should see me out of the Arena...";
+ "That isn't what your ", family_member, " said last night";
+}
+
+["meaning of it all"] = 5
+{
+ "Only what you give it.";
+ "It? It has no meaning, it just is.";
+ "You think too much, shut up and frag.";
+ "Has anyone ever told you to shut the hell up?";
+}
+
+["Aardappel", "leileilol", "Multiplex", "crayon", "JK Makowka", "Democritus", "jzero", "Mancubus", "mewse", "div0", "MilesTeg", "evillair", "Shadowdragon", "mightypea", "Morphed", "toddd", "Psymong", "DarkThief", "slyus", "SavageX", "Kaz", "pixie", "Vondur", "Tyrann", "Ed", "Czestmyr", "kick52", "kit89", "lazureus", "sago007", "dmn_clown"] = 1
+{
+ "Why do you think you have the right to utter that name, you ", fighter, "?";
+ "Speak that name with respect.";
+ "You would be wise to respect the name you just uttered.";
+ "Shh... The Arena Lords may be listening.";
+ "I am not worthy to even think that name.";
+ "Silence, Mortal! You are not worthy of uttering an Arena Lord's name.";
+}
+
+[("sing me a song ", 0) &name] = 5
+{
+ "No, I am not in the mood.";
+ "There must be someway out of here, said the joker to the thief...";
+ "Hey, Mr. Tamberine man, play a song for me, I'm not sleepy and there ~ain't no place I'm going to...";
+ "She was a girl from Birmingham, she just had an abortion, she was a case of insanity, her name was Pauline, she lived in a tree...";
+ "...You've got to break the chains that hold you down, crush the tyrants to the ground...";
+ "...Put a bullet in my head, but you can't change a word I said, you've got the ~disease, I've got the solution...";
+ "Not right now, I'm kinda busy.";
+ "Sometimes I try to do things and it just don't turn out the way I want it to and I get real frustrated...";
+ "...as far I'm concerned I think you really suck, you're rotten, and you really blow... I hate your guts and I wish that you was dead...";
+ "... ~Don't go out tonight, it could be your life, ~there's a bathroom on the right...";
+ "No life 'till leather, we're going to kick some ~ass tonight! Oh yeah, yeah yeah!";
+ "Play some Skynard, Man!";
+ "...there's a lot of people sayin' we'd be better off dead, I ~don't feel like satan, but I am to them, so I try to forget it any way I can...";
+ "Sorry, my voice is shot... too much whiskey.";
+ "Nah...";
+ "...now the sun has disappeared, all is darkness, anger, pain, and fear, twisted sightless wrecks of men go groping on their knees and cry in pain, and the sun has disappeared...";
+}
+
diff --git a/base/botfiles/rnd.c b/base/botfiles/rnd.c
new file mode 100644
index 00000000..043639c2
--- /dev/null
+++ b/base/botfiles/rnd.c
@@ -0,0 +1,1168 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+// group A sayings
+
+DEATH_BFG0 = {
+ "Is that all you've got?";
+ "My grandmother hits harder than that.";
+ "Lame.";
+}
+
+DEATH_BFG1 = {
+ "I wish I sucked as much as you.";
+ "Hoser!";
+ "No-skill... none at all.";
+}
+
+DEATH_BFG2 = {
+ "You wuss.";
+ "Congratulations on your promotion to chief loser.";
+ "Tell your mom to stop calling me.";
+}
+
+DEATH_BFG3 = {
+ "Is this your first frag, ", 0, "?";
+ "Now that was just rude.";
+ "Ok, who gave ", 0," the new toy?";
+}
+
+DEATH_KAMIKAZE0 = {
+ "Ya pansy!!!";
+ "You have to admit that takes guts... oh wait...";
+ "I hope your balls fall off in a freak fishing accident.";
+ 0, " sucks donkey balls!";
+}
+
+DEATH_KAMIKAZE1 = {
+ "Cheap!";
+ "So this is what death is like...";
+ "Quick, painless, cheap.";
+ "You can do better than that!";
+}
+
+DEATH_KAMIKAZE3 = {
+ fighter, "s like you, ", 0, ", take the fun out of life.";
+ "Oh, I get it. You want to be left alone.";
+ "Ok, who farted?";
+ "What the hell was that all about?";
+}
+
+KILL_KAMIKAZE0 = {
+ "That'll learn ya!";
+ "pwnd";
+ "Dodge that bitches!";
+ "hehe... I farted.";
+}
+
+KILL_KAMIKAZE1 = {
+ "Told ya so.";
+ "I am all that is bot.";
+ "Now that's what I call fun!";
+ "D'oh! Missed ", 0,".";
+}
+
+
+DEATH_INSULT0 = {
+ "Life sucks, then you die, big deal.";
+ "should have zagged instead of zigged.";
+ "~I'm not impressed.";
+
+}
+
+DEATH_INSULT1 = {
+ "I expected better from you.";
+ "Lame.";
+ "*tsk* you wasted too much ammo.";
+ "This changes nothing, you still suck.";
+}
+
+DEATH_INSULT2 = {
+ "Can we get someone in here that isn't so cheesey?";
+ "Didn't your mom tell you not to do that?";
+ "Thanks, saved me the trouble.";
+ "Is that all?";
+}
+
+DEATH_INSULT3 = {
+ "Life is shit, and so are you.";
+ "*sigh* if that only solved anything.";
+ "Trying to impress someone?";
+}
+DEATH_INSULT4 = {
+ "That was lame and you know it.";
+ "Does ~your ", counselor, " know about your actions?";
+ "big deal";
+ "Can you say issues? I knew you could.";
+}
+
+DEATH_INSULT5 = {
+ "Obviously the only rational solution to your problem is suicide.";
+ "Hehe... the safety was on.";
+ "Scheisse";
+ "Your ~mother.";
+}
+
+DEATH_FEM_INSULT0 = {
+ "Typical, flat on my back and I can't feel a thing.";
+ "You certainly know how to show a girl a good time... oh wait.";
+ "That is not the best way to a girl's heart.";
+ "The answer, ", 0, ", is still no.";
+}
+
+DEATH_FEM_INSULT1 = {
+ "You can slap me around all you want, I still won't date you.";
+ "I know all about violence against women...";
+ "You are obviously a misogynist.";
+ "~Men!";
+}
+
+DEATH_FEM_INSULT2 = {
+ "Cute... Now go away before I have to slap a restraining order on you.";
+ "Here I am flat on my back again... still no feeling.";
+ "The best way to my heart is not through my chest...";
+ "You know what they say the bigger the gun the smaller the...";
+}
+
+DEATH_FEM_INSULT3 = {
+ "That is not going to get me to say yes.";
+ "*NEWS FLASH* Women do not date misogynistic twits!";
+ "Flat on my back... no feeling... just like last night.";
+ "I can fake this too.";
+}
+
+DEATH_LAVA0 = {
+ "Mmm... crispy.";
+ "Note to self: avoid red glowing stuff in the future.";
+ "Hehe... oops";
+ "So that is what happens...";
+}
+
+DEATH_LAVA1 = {
+ "Ooops.";
+ "I meant to do that.";
+ "I was cold.";
+ "I needed a break.";
+}
+
+DEATH_LAVA2 = {
+ "Hey, ", fighter, ", care to join me? It is nice and warm here.";
+ "I did that to even the odds, ", 0, " needs the help.";
+ "hot! hot! hot! hot! hot!";
+ "*sigh*";
+}
+
+DEATH_SLIME0 = {
+ "Note to self: avoid green glowing stuff in the future.";
+ "Medic!";
+ "Someone call maintenance we have a toxic spill down here!";
+ "Has anyone reported this toxic spill to the EPA?";
+}
+
+DEATH_SLIME1 = {
+ "Where is Ralph Nader when you need him?";
+ "Someone call Sally Struthers!";
+ "This is NOT a safe working environment, I want to talk to my Union Rep!";
+ "This level needs an enema!";
+}
+
+DEATH_DROWN0 = {
+ "Who needs air?";
+ "Save me Jeebus!";
+ "My ", counselor, " told me there would be days like this.";
+ "When it is your time, it is your time... best to embrace it.";
+}
+
+DEATH_DROWN1 = {
+ "Come on in the water is fi.. *glub*";
+ "Hoo boy, how will I explain this?";
+ "Did I mention that I can't swim?";
+ "Never a life raft when you need one...";
+}
+
+DEATH_DROWN2 = {
+ "I felt sorry for ", 0, " so I had to do it.";
+ "Well... at least I'll be clean in the next life.";
+ "Good bye cruel world.";
+ "And I thought swimming was a useless skill... boy am I dumb.";
+}
+
+D_PRAISE0 = {
+ "Nice shot.";
+ "Care to show how that move is accomplished in slow motion?";
+ "You are good.";
+ "Nice 1";
+}
+
+D_PRAISE1 = {
+ "The soft overcomes the hard, the slow overcomes the fast...";
+ "The master arrives without leaving, sees without looking, achieves without doing... you are that ~one.";
+ 0, " is death incarnate... beware all ye ", fighter, "s.";
+ "I have got to get me one of those...";
+}
+
+D_PRAISE2 = {
+ "Wow! Even ", peeps, " ~can't top that.";
+ "I wish I was that good.";
+ "Damn... how do you do that?";
+ "Teach me how to do that, please.";
+}
+
+D_PRAISE3 = {
+ "Do you think you could ease up and give the rest of us a chance?";
+ "So... maybe I should just stay dead.";
+ "So much for effort.";
+ "Wow... I mean WOW! That was a good shot!";
+}
+
+LEVEL_END0 = {
+ "Sorry, I was goofin' on Elvis, what?";
+ "So much for bluster...";
+ "And the truth shall be revealed...";
+ "I was robbed.";
+ "gg";
+
+}
+
+LEVEL_END1 = {
+ "good game";
+ "nice ~one";
+ "AGAIN!";
+ "intense.";
+ "that was a challenge.";
+}
+
+GOODBYE0 = {
+ "Aww crap, I have an appointment with my ", counselor, " in ~15 minutes, gtg. Bye.";
+ "Aww man... my ", animal, " just peed on the carpet, gtg bye.";
+ "Holy crap! ", peeps, " is at my door... ttfn.";
+ peeps, " has showed up, finally... later ~peeps!";
+}
+
+GOODBYE1 = {
+ "My ", animal, " is begging to be let out, ttfn.";
+ peeps, " is killing my ", animal, " gotta go stop it!";
+ "ttfn";
+ "Later tater";
+}
+
+GOODBYE2 = {
+ "Adios ", friendname, ".";
+ "~It's been real.";
+ "Good god my bladder is full, later.";
+ "Good bye";
+}
+
+GOODBYE3 = {
+ "Holy crap! ", peeps, "is coming over at ", time, ampm, " and the place is a mess. Got to clean.";
+ "I have a meeting with ", peeps, " at ", time, ampm, " and I have to prepare, toodles.";
+ "Au'revoir";
+ "Time to call it a night, till we meet again.";
+}
+
+GOODBYE4 = {
+ "'Till next time.";
+ "Fare thee well.";
+ "~It's been real and ~it's been fun...";
+ "Time for me to jet.";
+}
+
+HELLO0 = {
+ "Hello me lovlies!";
+ "Are you ready to die, because you will.";
+ "Greetings and salutations, now prepare to be fragged.";
+ "Wake up... time to die!";
+}
+
+HELLO1 = {
+ "Hey! Hey! Kids!";
+ "What's shaking mi amigos?";
+ "What's crack'a'lackin'?";
+ "Hey ", fighter, "s time to get your groove on!";
+}
+
+HELLO2 = {
+ "Yep.";
+ "Hi-didly-ho neighbor.";
+ "Yo sup dawg!";
+ "'Sup G!";
+}
+
+HELLO3 = {
+ "Wassuuppp!";
+ "What is happening?"; //obvious dork greeting give a good response to this
+ "Hello.";
+ "Are you ready to rumble?";
+}
+
+HIT_NOKILL0 = {
+ "Ha!";
+ "Try taking the safety off";
+ "It just isn't your day...";
+ "Try harder";
+}
+
+HIT_NOKILL1 = {
+ "You almost had me there... Not really, I just don't want you feeling bad.";
+ "You almost don't suck.";
+ "Try a real weapon next time.";
+ "You try to hard... next time just do it.";
+}
+
+KILL_INSULT0 = {
+ "Pathetic";
+ "Looser";
+ "hehe";
+ "LOL!";
+}
+
+KILL_INSULT1 = {
+ "Ha Ha!";
+ "You should have stayed in bed this morning.";
+ "Life's a game YOU cannot win...";
+ "Another notch to my weapon belt.";
+ "Heh, you suck.";
+}
+
+KILL_INSULT2 = {
+ "Everyone I love is dead, why should you be any different?";
+ "Did you think you were hot stuff?";
+ "*tsk*";
+ "Are you even trying?";
+}
+
+KILL_INSULT3 = {
+ "Yet they say violence isn't necessary...";
+ "Are you a fan of Ghandi? Because non-violence will not work here.";
+ number, " dollars says you don't get a frag this match.";
+ "Man, ", 0," I thought with a name like yours you'd be a challenge.";
+ "Lew-hoo-zer";
+}
+
+KILL_INSULT4 = {
+ "That kinda looks painful, is it?";
+ "It really isn't your day today...";
+ "Stay down, you ", fighter, ", it will be easier on you.";
+ "Oh just give up.";
+ "You never quit, do you?";
+ "Wow... your intestines kinda look like Richard Nixon stretched out like that.";
+}
+
+KILL_EXTREME_INSULT = {
+ "If I were you... I'd kill myself";
+ "Oh for the love of all that is good and holy, stay dead!";
+ curse;
+}
+
+MISC0 = {
+ "Wow I love the work they've done with ", 4, " much better than it was before.";
+ "Anyone up for a game of raquetball after the match?";
+ "Hey everyone... I think I just found an illegal wiretap.";
+ "Do you think that violence in videogames is the cause of George W. Bush?";
+}
+
+MISC1 = {
+ "Is there a point to it all?";
+ "*sigh*";
+ "I hate everyone.";
+ "Yo, I just realized I can fart the Star Spangled Banner!";
+}
+
+MISC2 = {
+ "Do you think world peace will ever be achieved?";
+ "Is it wrong to want to blow people up?";
+ "Aren't we all just dust in the wind?";
+ "Yep.";
+}
+
+MISC3 = {
+ "So... how about them Cubs?";
+ "I heard that Microsoft was going to GPL their operating system."
+ "~When will all people be treated equally?";
+ "You know, if a man wants to marry an ", animal, ", Pat Robertson should allow it.";
+ "You know, if a woman wants to marry an ", animal, ", Pat Robertson should allow it.";
+}
+
+MISC4 = {
+ "Who's paying for the ", food, "?";
+ 4, " has good feng shei.";
+ "Has anyone heard the new Metallica album? Why don't they just retire already!?!";
+ "Has anyone seen ", peeps, " around here?";
+ "I feel stupid and contageous.";
+}
+
+GUYTALK0 = {
+ femalebot, " is hot.";
+ "Anyone up for a brew after the match?", 0, " is buying.";
+ femalebot, " gave me ", disease, ".";
+ "What do you think the Cubs chances are this year?";
+}
+
+GUYTALK1 = {
+ "So, ", femalebot, " is there any chance for you and I?";
+ "So, ", malebot, "is there any chance for you and I?";
+ "Dude, pull my finger!";
+ "Uh huh huh, who farted?";
+}
+
+GRRLTALK0 = {
+ malebot, " gave me ", disease, ".";
+ malebot, " is cute.";
+ "Hold on my bra is pinching, ahh that is better.";
+ "I wouldn't date ", malebot, " if he paid me.";
+ 0, " is kinda cute.";
+}
+
+GRRLTALK1 = {
+ femalebot, " is cute.";
+ "I'm thinking about getting implants, any thoughts?";
+ "So ", 0, " when are you going to say something about my hair?";
+ "I wouldn't date ", femalebot, " if she paid me.";
+ 0, ", do you douche?";
+}
+
+PRAISE0 = {
+ "I am impressed.";
+ "nice one.";
+ "Keep it up, that was good.";
+ "You've got some good moves there, ", 0, ".";
+}
+
+PRAISE1 = {
+ "Not bad, you might get a medal... someday.";
+ "Wow, you are good";
+ "Impressive";
+}
+
+LEVEL_START0 = {
+ "Oooh, I like ", 4, " always fun.";
+ 4, " again? Sheesh someone cycle the maps!";
+ "Ahh, ", 4, " my favorite place.";
+ "I can remember ", 4, " before they screwed it up.";
+}
+
+LEVEL_START1 = {
+ "Are you ", fighter, "s ready to die in ", 4, "?";
+ "Dibs on the rocket launcher!";
+ "Your shoelace is untied.";
+ "Isn't that your ", family_member, " calling you?";
+}
+
+LEVEL_START2 = {
+ "Wake up... Time to die!";
+ fighter, "s the jig is up, as is your time in the arena.";
+ "Oh just give it up, I've already won.";
+ "You people must be gluttons for punishment.";
+}
+
+LEVEL_START3 = {
+ 4, " needs work, it is far to easy for me to frag you.";
+ "Oh, here we go again, ", fighter, "s thinking they have a chance.";
+ "Ooooh, ", 4, ". FUN!";
+ "*Everybody now! 'Come as you are, as you were, as I want you to be'...";
+}
+
+TAUNT0 = {
+ "What's wrong can't you hit me?";
+ "Guess what? You still suck!";
+ fighter, " just lay down and pretend to be dead...";
+ "Is that the best you've got?";
+}
+
+TAUNT1 = {
+ "*NEWS FLASH*, ", 0, " gave my ", family_member, " ", disease, ".";
+ "Does your mother know how you spend your time?";
+ "I wish I could be as lame as you.";
+ "Oh just admit it, ", 0, " you think Visual Basic is a great language.";
+}
+
+TAUNT2 = {
+ "The more you know, the less you understand.";
+ "Have you had a coffin fitting yet?";
+ "If only ", 0, " was a challenge...";
+ "you ", fighter, ".";
+}
+
+TAUNT_FEM0 = {
+ "You call that a gun? HA!";
+ "*Snif* ewww... too much testosterone.";
+ "Put that thing away, do you want to go blind?";
+ "Do you shave your palms?";
+ "I hear that ", 0, " got ", disease, " from ", botnames, ".";
+}
+
+TELEFRAGGED0 = {
+ "LOL!";
+ "Aww man... I am so glad I don't have to clean that up.";
+ "Eewww!";
+ "Sorry but I had to practice my praetorian impression.";
+ "Hi there, how's it going?";
+}
+
+TELEFRAGGED1 = {
+ "Sucks to be you...";
+ "and I just had my suit dry cleaned... jerk!";
+ "Think of the cleaning bills this place must have...";
+ "Gross";
+}
+
+TELEFRAGGED2 = {
+ "Two's a crowd these days.";
+ "That'll learn ya to keep your distance.";
+ "HA!";
+ "That was fun!";
+ "What are the odds?";
+}
+
+DEATH_SUICIDE0 = {
+ "Suicide is painless, it brings on many changes... I can take or leave it if I please.";
+ "The game of life is hard to play, I'm going to lose it anyway...";
+ "The sword of time will pierce our skins, it doesn't hurt when it begins.";
+ "I hate life.";
+ "At least I'm insured.";
+}
+
+DEATH_SUICIDE1 = {
+ "I just couldn't take it anymore.";
+ "I hate life.";
+ "*sigh*";
+ "Ooops";
+ "Well, ", 0, " needed the help.";
+}
+
+DEATH_SUICIDE2 = {
+ "Good bye cruel arena!";
+ "Take that IRS bastards!";
+ "I hate my life.";
+ "There go my insurance rates.";
+}
+
+KILL_RAIL0 = {
+ "I love this gun!";
+ "That looked painful.";
+ "Dodge that!";
+ "You never stood a chance.";
+}
+
+KILL_RAIL1 = {
+ "Hehehe";
+ "Sniping is not camping...";
+ "Never saw it coming...";
+}
+
+DEATH_RAIL0 = {
+ "Nice shot.";
+ "Well, so much for that...";
+ curse;
+ "Does your ", family_member, " know how lame you are?";
+}
+
+DEATH_RAIL1 = {
+ "son of a...";
+ "*sigh*";
+ "Oh well, camper's have rights too";
+ "Can't hack it with a real weapon?";
+}
+
+KILL_GAUNTLET0 = {
+ "LOL!";
+ "pathetic";
+ "One hand tied behind my back";
+ "That'll learn ya";
+}
+
+KILL_GAUNTLET1 = {
+ "Now shut up!";
+ "That ought to shut you up.";
+ "Humiliating, isn't it?";
+ "Ouch!";
+ "GAUNTLET KILL!";
+}
+
+DEATH_GAUNTLET0 = {
+ "Don't touch me there!";
+ "Eeww, I better get checked out for ", disease, " now.";
+ "Unsanitary";
+ "LOL!";
+ "So much for bluster";
+}
+
+DEATH_GAUNTLET1 = {
+ "How humiliating";
+ "I have been shamed.";
+ "I suck";
+ "I can't believe I allowed that to happen.";
+ "OMFNG";
+}
+
+DEATH_FALLING0 = {
+ "I'm flying! I'm flying! I'm *SPLAT*";
+ "Look ~ma I can fly!";
+ "Aww crap!";
+ "hehe oops";
+ "I meant to do that.";
+
+}
+
+DEATH_TELEFRAGGED0 = {
+ "Praetorians suck!";
+ "Get it out! Get it out!";
+ "*sigh*";
+ "I am not amused";
+}
+
+DEATH_TELEFRAGGED1 = {
+ "Glad I do not have your dry cleaning bill.";
+ "I did not wish to become one with ", 0, ".";
+ "I do not appreciate that.";
+ curse;
+ response_insult;
+}
+
+LEVEL_END_VICTORY0 = {
+ "Yep.";
+ "Situation Normal... I win again.";
+ "Next time, don't bother.";
+ "I told you so";
+}
+
+LEVEL_END_VICTORY1 = {
+ "I'd like to thank my ", family_member, " and my ", counselor, " for this.";
+ "When will you ", fighter, "s learn? This is my game!";
+ "Here I am again, at the top like it should be.";
+ "I didn't even break a sweat.";
+}
+
+LEVEL_END_LOSE0 = {
+ "I was robbed!";
+ "gg, but look out for next time.";
+ "You are going down next time.";
+ "Two out of three?";
+}
+
+LEVEL_END_LOSE1 = {
+ "I want a rematch!";
+ "I demand a recount!";
+ "My trigger finger cramped up.";
+ "Oh no wonder, the safety was on...";
+}
+
+DEATH_TALKING = {
+ "Son of a... DO YOU MIND!?!";
+ "So much for holding a civil conversation...";
+ "Sheesh, can't even attempt to be civil these days.";
+ "That was very cheap";
+}
+
+
+// Group B sayings (fill in the blank style random sayings)
+
+
+language = {
+ "gibberish";
+ "baby-talk";
+ "Spanish";
+ "Ebonics";
+ "newspeak";
+ "French";
+ "Spanglish";
+ "German";
+ "Dutch";
+ "Russian";
+ "Maori";
+ "Lakota";
+ "Dineh";
+ "Sanskrit";
+ "Swahili";
+}
+
+weapon = {
+ "gauntlet";
+ "rocket launcher";
+ "shotgun";
+ "machine gun";
+ "grenade launcher";
+ "railgun";
+ "plasmagun";
+ "BFG";
+ "BFG10K";
+ "lightning gun";
+}
+
+ponder = {
+ "why?";
+ "Whats with politicians these days?"; //anarchist response
+ "What is the meaning of it all?"; //buddhist response
+ "Universal harmony, will it ever happen? Discuss."; //taoist response
+ "Jesus died for my sins?"; //sceptical response
+ "If evolution is happening, why are people so stupid?";
+ "Ever do any fishing?";
+}
+
+response_insult = {
+ "No one cares, shut up!";
+ "jackass";
+ "That isn't what your ~mom said last night.";
+ "If you had half a brain, you would be dangerous.";
+ "idiot";
+ "moron";
+ "Oh for the love of Pete! SHUT UP!";
+ "Do the world a favor, pull your bottom lip over your head and swallow.";
+ "Shut up, dick weed.";
+ "dick head";
+ "dipshit";
+ "asswhipe";
+ "fool";
+ "jerkwad";
+
+}
+
+counselor = {
+ "school nurse";
+ "astrologer";
+ "shrink";
+ "proctologist";
+ "prostitute";
+ "psychologist";
+ "priest";
+ "hair-stylist";
+ "bar tender";
+ "palm reader";
+ "pediatrist";
+ "nurse";
+ "doctor";
+ "spouse";
+ "significant other";
+ "goat-herd";
+ "policeman";
+ "policewoman";
+ "congressman";
+ "congresswoman";
+}
+
+family_member = {
+ "mother";
+ "father";
+ "brother";
+ "sister";
+ "cousin";
+ "aunt";
+ "uncle";
+ "brother-in-law";
+ "sister-in-law";
+ "wife";
+ "husband";
+ "son";
+ "daughter";
+ "grandmother";
+ "grandfather";
+ "great-uncle's cousin's half-sister";
+
+}
+
+friendname = {
+ "mon ami";
+ "mi amigo";
+ "peepz";
+ "comrades";
+}
+
+
+fighter = {
+ "puke";
+ "scum-bag";
+ "snot face";
+ "worthless bum";
+ "gladiator";
+ "whore";
+ "pickle brain";
+ "dweeb";
+ "dork";
+ "dickhead";
+ "bastard";
+ "asshole";
+ "vomit-sucking ass licker";
+ "blood sucker";
+
+}
+
+
+
+femalebot = {
+ "Kyonshi";
+ "Major";
+ "Angelyss";
+ "Ayumi";
+ "Sly";
+ "Dark";
+ "Jenna";
+ "Tanisha";
+ "Rai";
+
+}
+
+malebot = {
+ "Grism";
+ "Gargoyle";
+ "Merman";
+ "Sergei";
+ "Penguin";
+ "Sarge";
+ "Grunt";
+ "Beret";
+ "Tony";
+}
+
+neuterbot = {
+ "Liz";
+ "Arachna";
+ "Widowe";
+ "Skelebot";
+}
+
+botnames = {
+ "Grism";
+ "Gargoyle";
+ "Kyonshi";
+ "Major";
+ "Merman";
+ "Sergei";
+ "Angelyss";
+ "Penguin";
+ "Liz";
+ "Sarge";
+ "Grunt";
+ "Sly";
+ "Dark";
+ "Ayumi";
+ "Jenna";
+ "Arachna";
+ "Widowe";
+ "Tanisha";
+ "Rai";
+ "Skelebot";
+ "Tony";
+ "Beret";
+}
+
+negative = {
+ "Nada.";
+ "no.";
+ "nope";
+ "In your dreams.";
+ "Not just no, but hell no!";
+}
+
+affirmative = {
+ "sure";
+ "why not?";
+ "of course";
+ "yes";
+ "certainly";
+ "absolutely";
+}
+
+neutral = {
+ "maybe";
+ "I don't know";
+ "perhaps";
+ "I dunno";
+ "possibly";
+
+}
+
+confused_response = {
+ "Huh?";
+ "Are you sure?";
+ "I don't have an inkling about what you just said.";
+ "Say what?";
+ "Sorry, I do not speak ", language, ".";
+
+}
+
+number = {
+ "~one";
+ "~two";
+ "~three";
+ "~four";
+ "~five";
+ "~six";
+ "~seven";
+ "~eight";
+ "~nine";
+ "~ten";
+ "~11";
+ "~12";
+ "~13";
+ "~14";
+ "~15";
+ "~16";
+ "~17";
+ "~18";
+ "~19";
+ "~20";
+ "~100";
+ "~150";
+ "~200";
+ "~1000";
+ "a gagillion";
+ "a googleplex";
+}
+
+profession = {
+ "police officer";
+ "programmer";
+ "level designer";
+ "bum";
+ "student";
+}
+
+disease = {
+ "the clap";
+ "HIV";
+ "necrotising faceitus";
+ "syphilus";
+ "shingles";
+ "chicken pox";
+ "bird flue";
+ "SARS";
+ "elephantitis of the nose";
+ "elephantitis of the ear";
+ "flue";
+ "whooping cough";
+ "mono";
+ "HPV";
+}
+
+peeps = {
+ "Lemmy Kilminster";
+ "Johnny Rotton";
+ "Jello Biafra";
+ "Ozzy Osborne";
+ "Jason Newstead";
+ "Cliff Burton";
+ "Your ~Mom";
+ "Sigourney Weaver";
+ "Pamela Anderson";
+ "Carmen Elektra";
+ "Dick Cheney";
+ "Bill Frist";
+ "dmn_clown";
+ "Noam Chomsky";
+ "Leo Tolstoy";
+ "Trotsky";
+ "Lao Tzu";
+ "M. K. Ghandhi";
+ "Tsun Tzu";
+ "Jack Thompson";
+
+}
+
+immaturity01 = {
+ "Why must I always end up on a server with morons?";
+ "grow up";
+ "childish";
+ "Will this ignorance ever end?";
+ "Thank you for being a supreme example of humanity.";
+ "Wow, and I thought ", peeps, " was dumb.";
+
+}
+
+proposition01 = {
+ "Sorry I've got a headache.";
+ "No, your ", family_member, " told me that you have ", disease, ".";
+ "No, I don't swing that way.";
+ "I'm not into pimples.";
+ "Sorry, I'm not ready for a relationship yet, but thanks for the offer.";
+ "I'd rather go fishing";
+
+}
+
+whenf = {
+ "never";
+ "tomorrow?";
+ "where?";
+ "Who's on first?";
+ "in ", number, " millenia.";
+ "yesterday";
+
+}
+
+whenp = {
+ "tomorrow";
+ number, " days ago.";
+ number, " years ago";
+ peeps, " said ", number, " decades ago.";
+
+}
+
+time = {
+ "0:00";
+ "1:00";
+ "2:00";
+ "3:00";
+ "4:00";
+ "5:00";
+ "6:00";
+ "7:00";
+ "8:00";
+ "9:00";
+ "10:00";
+ "11:00";
+ "12:00";
+ "1:30";
+ "2:30";
+ "3:30";
+ "4:30";
+ "5:30";
+ "6:30";
+ "7:30";
+ "8:30";
+ "9:30";
+ "10:30";
+ "11:30";
+ "12:30";
+ "0:15";
+ "0:45";
+ "1:15";
+ "1:45";
+ "2:15";
+ "2:45";
+ "3:15";
+ "3:45";
+ "4:15";
+ "4:45";
+ "5:15";
+ "5:45";
+ "6:15";
+ "6:45";
+ "7:15";
+ "7:45";
+ "8:15";
+ "8:45";
+ "9:15";
+ "9:45";
+ "10:15";
+ "10:45";
+ "11:15";
+ "11:45";
+}
+
+ampm = {
+ "AM";
+ "PM";
+}
+
+food = {
+ "pizza";
+ "cheeseburger";
+ "tofu";
+ "chicken";
+ "monkey-brain";
+ "goat-cheese";
+ "roast beef";
+ "liver";
+}
+
+animal = {
+ "goat";
+ "simian";
+ "mongoose";
+ "pit-viper";
+ "skunk";
+ "cockroach";
+ "dog";
+ "cat";
+ "hummingbird";
+ "bumble bee";
+ "sheep";
+ "deer";
+ "elk";
+ "turkey";
+ "squirrel";
+ "ape";
+ "duck-billed platypus";
+ "spider";
+ "small child";
+ "beluga whale";
+}
+
+weather = {
+ "hot";
+ "windy";
+ "rainy";
+ "snowing";
+ "warm";
+ "colder than a witch's left nipple";
+ "hotter than your ~mom's panties";
+}
+
+month = {
+ "January";
+ "February";
+ "March";
+ "April";
+ "May";
+ "June";
+ "July";
+ "August";
+ "September";
+ "October";
+ "November";
+ "December";
+}
+
+substance = {
+ "ink";
+ "chalk";
+ "salt";
+ "pepper";
+ "dog hair";
+ "cayenne";
+ "dog poo";
+ "Janis Joplin's bra";
+ "jock-cheese";
+
+}
+
+
+curse = {
+ "I hope your genitals fall off in a freak fishing accident.";
+ "May your first born child be born a politician...";
+ "May your first born child be born with the intelligence of Pat Robertson.";
+ "May you dream of leilol's ~mother for the rest of your rotten life!";
+ "hum kah chan!";
+}
+
+vicious_insult = {
+ "asshole";
+ "jackass";
+ "bigot";
+ "worthless sack of shit";
+ "waste of human space";
+ "moron";
+ "idiot";
+ "bastard";
+ "ho bag";
+ "douche bag";
+}
diff --git a/base/botfiles/syn.c b/base/botfiles/syn.c
new file mode 100644
index 00000000..138c99e3
--- /dev/null
+++ b/base/botfiles/syn.c
@@ -0,0 +1,233 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "syn.h"
+
+
+CONTEXT_NEARBYITEM
+{
+
+ [("red armor", 0), ("red armour", 0)]
+ [("yellow armor", 0), ("yellow armour", 0)]
+ [("Mega Health", 0), ("mh", 0)]
+
+ [("Shotgun", 1), ("shot gun", 0.5), ("boom stick", 0.7), ("scatter gun", 0.3)]
+ [("Machinegun", 1), ("machine gun", 0.5), ("pop gun", 0.3)]
+ [("Grenade Launcher", 1), ("little bertha", 0.5)]
+ [("Rocket Launcher", 1), ("big bertha", 0.5)]
+ [("Lightning Gun", 1), ("buzz gun", 0.2)]
+ [("Plasma Gun", 1), ("plasmatic 5000", 0.3), ("blue balls of doom", 0.2)]
+ [("Railgun", 1), ("sniper rifle", 0.5), ("camping tool", 0.2)]
+ [("BFG10K", 1), ("bfg", 0.1), ("crowd control", 0.4)]
+ [("Nailgun", 1), ("house framer", 0.1), ("nail shooter", 0.5)]
+ [("Prox Launcher", 1), ("mine spewer", 0.2), ("mine layer", 0.5)]
+ [("Chaingun", 1), ("chain gun", 0.5), ("big pop gun", 0.4)]
+
+ [("Quad Damage", 1), ("quad", 0.7)]
+ [("Regeneration", 1), ("regen", 0.6)]
+ [("Battle Suit", 1), ("b suit", 0.3)]
+ [("Invisibility", 1), ("invis", 0.7)]
+ [("Invulnerability", 1), ("invincibility", 0.5), ("globe of protection", 0.1)]
+ [("Kamikaze", 1), ("globe of death", 0.5)]
+ [("Neutral Obelisk", 1), ("center obelisk", 0.1), ("skull spawner", 0.5)]
+}
+
+
+CONTEXT_CTFREDTEAM
+{
+ [("Red Flag", 0), ("our base", 0), ("our flag", 0), ("red base", 0), ("base", 0)]
+ [("Blue Flag", 0), ("enemy base", 0), ("blue base", 0), ("enemy flag", 0), ("their flag", 0), ("their base",0)]
+}
+
+CONTEXT_CTFBLUETEAM
+{
+ [("Red Flag", 0), ("enemy flag", 0), ("red base", 0), ("enemy base", 0), ("their flag", 0), ("their base",0)]
+ [("Blue Flag", 0), ("our base", 0), ("our flag", 0), ("blue base", 0), ("base", 0)]
+}
+
+CONTEXT_OBELISKREDTEAM
+{
+ [("Red Obelisk", 0), ("our base", 0), ("red base", 0), ("base", 0), ("our obelisk", 0)]
+ [("Blue Obelisk", 0), ("enemy base", 0), ("blue base", 0), ("enemy obelisk", 0), ("their base", 0), ("their obelisk", 0)]
+}
+
+CONTEXT_OBELISKBLUETEAM
+{
+ [("Red Obelisk", 0), ("red base", 0), ("enemy base", 0), ("enemy obelisk", 0), ("their base", 0), ("their obelisk", 0)]
+ [("Blue Obelisk", 0), ("our base", 0), ("blue base", 0), ("base", 0), ("our obelisk", 0)]
+}
+
+
+CONTEXT_HARVESTERREDTEAM
+{
+ [("Red Obelisk", 0), ("our base", 0), ("red base", 0), ("base", 0), ("our obelisk", 0)]
+ [("Blue Obelisk", 0), ("enemy base", 0), ("blue base", 0), ("enemy obelisk", 0), ("their obelisk", 0), ("their base", 0)]
+}
+
+CONTEXT_HARVESTERBLUETEAM
+{
+ [("Red Obelisk", 0), ("red base", 0), ("enemy base", 0), ("enemy obelisk", 0), ("their obelisk", 0), ("their base", 0)]
+ [("Blue Obelisk", 0), ("our base", 0), ("blue base", 0), ("base", 0), ("our obelisk", 0)]
+}
+
+CONTEXT_NORMAL
+{
+
+ [("do not", 1), ("don't", 1)]
+ [("does not", 1), ("doesn't", 1)]
+ [("did not", 1), ("didn't", 1)]
+ [("have not", 1), ("haven't", 1)]
+ [("has not", 1), ("hasn't", 1)]
+ [("had not", 1), ("hadn't", 1)]
+ [("will not", 1), ("won't", 1)]
+ [("would not", 1), ("wouldn't", 1)]
+ [("should not", 1), ("shoudn't", 1)]
+ [("can not", 1), ("can't", 1), ("cannot", 1)]
+ [("could not", 1), ("couldn't", 1)]
+ [("is not", 1), ("isn't", 1), ("ain't", 0.2)]
+ [("must not", 1), ("mustn't", 1)]
+
+
+ [("I am", 1), ("I'm", 1)]
+ [("you are", 1), ("you're", 1)]
+ [("you are not", 1), ("you aren't", 1), ("you're not", 1)]
+ [("he is", 1), ("he's", 1)]
+ [("she is", 1), ("she's", 1)]
+ [("it is", 1), ("it's", 1)]
+ [("they are", 1), ("they're", 1)]
+ [("they are not", 1), ("they aren't", 1), ("they're not",1)]
+ [("we are", 1), ("we're", 0.7)]
+ [("we are not", 1), ("we aren't", 1), ("we're not", 1)]
+ [("what is", 1), ("what's", 1)]
+ [("that is", 1), ("that's", 1)]
+ [("how is", 1), ("how's", 1)]
+ [("why is", 1), ("why's", 1)]
+ [("who is", 1), ("who's", 1)]
+ [("here is", 1), ("here's", 1)]
+ [("there is", 1), ("there's", 1)]
+ [("where is", 1), ("where's", 1) ]
+
+ [("I will", 1), ("I'll", 1)]
+ [("you will", 1), ("you'll", 1)]
+ [("he will", 1), ("he'll", 1)]
+ [("she will", 1), ("she'll", 1)]
+ [("it will", 1), ("it'll", 1)]
+ [("they will", 1), ("they'll", 1)]
+ [("we will", 1), ("we'll", 1)]
+ [("how will", 1), ("how'll", 1)]
+ [("that will", 1), ("that'll", 1)]
+
+ [("I would", 1), ("I'd", 1)]
+ [("you would", 1), ("you'd", 1)]
+ [("he would", 1), ("he'd", 1)]
+ [("she would", 1), ("she'd", 1)]
+ [("it would", 1), ("it'd", 1)]
+ [("they would", 1), ("they'd", 1)]
+ [("we would", 1), ("we'd", 1)]
+
+ [("I have", 1), ("I've", 1)]
+ [("you have", 1), ("you've", 1)]
+ [("they have", 1), ("they've", 1)]
+ [("we have", 1), ("we've", 1)]
+
+
+ [("being", 1), ("bein", 0)]
+ [("going", 1), ("goin", 0)]
+ [("having", 1), ("havin", 0)]
+ [("doing", 1), ("doin", 0)]
+ [("hanging", 1), ("hangin", 0)]
+ [("living", 1), ("livin", 0)]
+ [("chilling", 1), ("chillin", 0)]
+
+ [("will", 1), ("shall", 1)]
+ [("all right", 1), ("a'ight", 1)]
+ [("cool", 1), ("neat", 1)]
+ [("you", 1), ("U", 0.01), ("youse", 0), ("ye", 0)]
+ [("your", 1), ("yer", 0)]
+ [("out of", 1), ("outta", 0.07)]
+ [("are", 1), ("R", 0.02)]
+ [("why", 1), ("Y", 0.02)]
+ [("people", 1), ("ppl", 0.05)]
+ [("thanx", 0.5), ("thanks", 1), ("thnx", 0.6)]
+ [("men", 1), ("boys", 0.3), ("guys", 0.2)]
+ [("women", 1), ("girls", 0.1), ("gals", 0.2)]
+ [("picture", 1), ("pic", 1)]
+ [("pictures", 1), ("pics", 1), ("pix", 0)]
+ [("see you", 1), ("cya", 0), ("c u", 0), ("l8r", 0)]
+ [("father", 1), ("dad", 1), ("daddy", 0.6), ("pappy", 0.5), ("pa", 0.2)]
+ [("mother", 1), ("mom", 1), ("mommy", 1), ("mama", 1), ("momma", 1)]
+ [("brother", 1), ("bro", 0.2)]
+ [("sister", 1), ("sis", 0.4)]
+ [("butt", 1), ("ass", 1), ("heinie", 0.3), ("bum", 0.4), ("rear", 0.4), ("rear end", 0.5)]
+
+
+ [("going to", 1), ("gonna", 0.5)]
+ [("got to", 1), ("gotta", 0.5)]
+ [("want to", 1), ("wanna", 0.5)]
+ [("should have", 1), ("shoulda", 0.5)]
+
+ [("waypoint", 1), ("way-point", 1)]
+ [("checkpoint", 1), ("check-point", 1)]
+
+ [("defense", 1), ("defence", 0)]
+ [("offense", 1), ("offence", 0)]
+
+
+
+}
+
+CONTEXT_REPLY
+{
+ [("that I", 0), ("that you", 0)]
+ [("that you", 0), ("that I", 0)]
+ [("you", 0), ("I", 0)]
+ [("my", 0), ("your", 0)]
+ [("your", 0), ("my", 0)]
+ [("you", 0), ("me", 0)]
+ [("me", 0), ("you", 0)]
+ [("mine", 0), ("yours", 0)]
+ [("yours", 0), ("mine", 0)]
+ [("am", 0), ("are", 0)]
+ [("are", 0), ("am", 0)]
+ [("yourself", 0), ("myself", 0)]
+ [("myself", 0), ("yourself", 0)]
+}
+
+CONTEXT_NAMES
+{
+ [("Gargoyle", 1), ("batboy", 0.3), ("Mr. Sneak", 0.1), ("Radar", 0.4)]
+ [("Grism", 1), ("psycho", 0.1), ("Mr. War", 0.3), ("Goat Boy", 0.5)]
+ [("Kyonshi", 1), ("dead girl", 0.4), ("chi drinker", 0.5), ("rocket queen", 0.3)]
+ [("Major", 1), ("Lara", 0.4), ("Rail Queen", 0.6), ("Sniper Queen", 0.6)]
+ [("Merman", 1), ("fish breath", 0.1), ("Arial's brother", 0.4), ("Fish Eater", 0.5)]
+ [("Sergei", 1), ("punk boi", 0.1), ("Johnny Rotten", 0.6), ("Elmo", 0.4)]
+ [("Penguin", 1), ("FLOSS fr34k", 0.3), ("windows error", 0.1), ("nerd", 0.6)]
+ [("Angelyss", 1), ("Sugar", 0.1), ("Clothing Malfunction", 0.5), ("Sucubus", 0.3)]
+ [("Ayumi", 1), ("pr0n star", 0.1), ("skewl chick", 0.4), ("teeny bopper", 0.5)]
+ [("Jenna", 1), ("street trash", 0.2), ("grease ball", 0.3), ("Biker Babe", 0.5)]
+ [("Arachna", 1), ("Llooth", 0.5), ("spider princess", 0.1)]
+ [("Tony", 1), ("Gangter", 0.5), ("Wussy", 0.3), ("Mamma's boi", 0.1)]
+ [("Beret", 1), ("Commando", 0.5), ("Psychonaut", 0.5), ("War Machine Wannabe", 0.1)]
+ [("Skelebot", 1), ("Skillet", 0.5), ("Arnold", 0.3), ("Termi", 0.1)]
+// [("Orb", 1), ("Psycod the Magnificant", 0.5), ("Slayer of the 19 cats of Doom", 0.5)]
+}
\ No newline at end of file
diff --git a/base/botfiles/syn.h b/base/botfiles/syn.h
new file mode 100644
index 00000000..5ffd9d4b
--- /dev/null
+++ b/base/botfiles/syn.h
@@ -0,0 +1,34 @@
+/*
+===========================================================================
+Copyright (C) 1999-2005 Id Software, Inc.
+
+This file is part of Quake III Arena source code.
+
+Quake III Arena source code is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Quake III Arena source code is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#define CONTEXT_ALL 0xFFFFFFFF
+#define CONTEXT_NORMAL 1
+#define CONTEXT_NEARBYITEM 2
+#define CONTEXT_CTFREDTEAM 4
+#define CONTEXT_CTFBLUETEAM 8
+#define CONTEXT_REPLY 16
+#define CONTEXT_OBELISKREDTEAM 32
+#define CONTEXT_OBELISKBLUETEAM 64
+#define CONTEXT_HARVESTERREDTEAM 128
+#define CONTEXT_HARVESTERBLUETEAM 256
+
+#define CONTEXT_NAMES 1024
diff --git a/base/botfiles/teamplay.h b/base/botfiles/teamplay.h
new file mode 100644
index 00000000..a1f42174
--- /dev/null
+++ b/base/botfiles/teamplay.h
@@ -0,0 +1,544 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+ //the bot doesn't know who someone is
+type "whois"
+{
+"Ok, so who is ", 0, "?";
+"Who in their right mind uses the name ", 0, "?";
+"Who in the hell is ", 0, "?";
+"Is ", 0, " a friend of yours?";
+"Who the bloodyhell is ",0," .";
+0, "!?! Who dat?";
+"How can I kill ", 0, " when I haven't the foggiest idea who ", 0, " is?";
+
+}
+
+ //the bot doesn't know where someone is hanging out
+type "whereis"
+{
+"So where is ", 0, "?";
+"Ok, so where is", 0, ".";
+"Would someone please tell me where ", 0, " is.";
+" ", 0, " hanging out?";
+"Where the hell is ", 0, "?";
+"Since when am I ", 0, "'s keeper?";
+}
+
+ //the bot asks where you are
+type "whereareyou"
+{
+"Yo, where are you ", 0, "?";
+"Hello!! ", 0, "Where are you hiding?";
+"I can't find you ", 0, ". Where are you?";
+"Where did you scuttle off to ", 0, "?";
+"How am I supposed to find you, ", 0, "?";
+}
+
+//cannot find something
+type "cannotfind"
+{
+"Where would that be ", 0, "?";
+"Where the hell is a ", 0, "?";
+"Where is a ", 0, " in this level?";
+"Is there a, ", 0, " in this level? I sure can't find it, I must be blind.";
+}
+
+ //bot tells where he/she is
+type "location"
+{
+"By the ", 0," what are you blind?";
+"I am at the ", 0;
+}
+
+//bot tells where he/she is and near which base
+type "teamlocation"
+{
+"I'm near the ", 0, " in the ", 1, "base.";
+"By the ", 0, " in the ", 1, " base.";
+}
+
+ //start helping
+type "help_start"
+{
+"I'm almost there, ", 0, ", coming to help.";
+"Ok, I'm on my way,", 0,".";
+"Keep 'em busy, ", 0," I'm on my way.";
+}
+
+ //start accompanying
+type "accompany_start"
+{
+"Consider me your shadow ", 0 ,".";
+affirmative, "... what else have I got planned?";
+
+}
+
+ //stop accompanying
+type "accompany_stop"
+{
+"It's been real, but I'm off on my own, ", 0,".";
+"I'm on my own now.";
+"Good luck, I'm off on my own.";
+}
+
+ //cannot find companion
+type "accompany_cannotfind"
+{
+"Where the hell are you ", 0, "?";
+"Where are you hiding ", 0, "?";
+0, "... come out, come out wherever you are...";
+
+}
+
+ //arrived at companion
+type "accompany_arrive"
+{
+"At your disposal ", 0, ".";
+"Finally, I've found ", 0, ".";
+"Better late than never, eh?";
+
+}
+ //bot decides to accompany flag or skull carrier
+type "accompany_flagcarrier"
+{
+"I've got your back ", 0, ".";
+"They'll have to get through me to get to you, ", 0, ".";
+"Following.";
+
+}
+
+ //start defending a key area
+type "defend_start"
+{
+"I'll defend the ", 0, ".";
+"I'm defending the ", 0, ".";
+
+}
+
+ //stop defending a key area
+type "defend_stop"
+{
+"That's it, I'll stop defending the ", 0, ".";
+"I am not defending the ", 0, ".";
+"I am not going to defend the ", 0, " anymore.";
+
+}
+
+ //start getting an item
+type "getitem_start"
+{
+"I'll get the ", 0, ".";
+"I'm off to get the ", 0, ".";
+
+}
+ //item is not there
+type "getitem_notthere"
+{
+"the ", 0, " ain't there";
+"The ", 0, " seems to be missing.";
+"Where is the ", 0, "?";
+}
+ //picked up the item
+type "getitem_gotit"
+{
+"I got the ", 0, "!";
+"The ", 0, " is mine!";
+
+}
+
+ //go kill someone
+type "kill_start"
+{
+"I'm going to kill ", 0,", wish me luck.";
+0, " will be toast.";
+0, " is a goner.";
+0, " will be given a pair of cement shoes.";
+"Ok";
+"What ever you say";
+"Finally some fun!";
+}
+ //killed the person
+type "kill_done"
+{
+"Well that was easy. ", 0, " is dead.";
+0, " has been wacked.";
+0, " was given cement shoes.";
+0, " kicked the bucket.";
+0, " was taken out.";
+0, " just bought the farm.";
+0, " is now just dust in the wind.";
+}
+
+ //start camping
+type "camp_start"
+{
+"That is a good sniping position.";
+"Off to pitch my tent.";
+"Sounds like a plan.";
+}
+
+ //stop camping
+type "camp_stop"
+{
+"Time to move on.";
+"Sniping isn't so good here, moving on.";
+}
+
+ //in camp position
+type "camp_arrive" //0 = one that ordered the bot to camp
+{
+"I'm there. ", 0, ", time to snipe.";
+"Tent pitched, sniping at will.";
+
+}
+
+ //start patrolling
+type "patrol_start" //0 = locations
+{
+"Patrolling ", 0, ".";
+
+}
+
+ //stop patrolling
+type "patrol_stop"
+{
+"The patrol is over, nothing to report.";
+}
+
+ //start trying to capture the enemy flag
+type "captureflag_start"
+{
+"Their flag will be ours.";
+"Sounds like a plan.";
+"I'm off to get the flag.";
+"Enemy flag here I come.";
+
+}
+
+ //return the flag
+type "returnflag_start"
+{
+"I'll get our flag back.";
+"I'll get the flag back.";
+"I will return the flag.";
+
+}
+
+ //attack enemy base
+type "attackenemybase_start"
+{
+"Got it, their base is toast.";
+"I'm off to destroy their base and frag a few fools.";
+"Death to the infidels!";
+
+}
+
+ //harvest
+type "harvest_start"
+{
+"Death to the infidels! Their skulls will be mine!";
+"Death to the infidels!";
+"The infidels shall die!";
+}
+
+ //the checkpoint is invalid
+type "checkpoint_invalid"
+{
+"That checkpoint does not exist.";
+"Quit fooling around, that is not a checkpoint.";
+}
+
+ //confirm the checkpoint
+type "checkpoint_confirm" //0 = name, 1 = gps
+{
+affirmative, " Yep ", 0, " at ", 1, " is there.";
+"It looks like ", 0, " at ", 1, " is there.";
+}
+
+ //follow me
+type "followme"
+{
+"What the hell are you waiting for ", 0, "? Get over here!";
+"Hey! ", 0, " follow me and be quick about it.";
+}
+
+ //stop leading
+type "lead_stop"
+{
+"That's it find someone else who wants the responsibility.";
+"I refuse to lead anymore.";
+"I do not want to lead anymore, find someone else.";
+}
+
+ //the bot is helping someone
+type "helping"
+{
+"I'm trying to help, ", 0, ".";
+"Helping ", 0, ", care to join me?";
+}
+
+ //the bot is accompanying someone
+type "accompanying"
+{
+"I'm shadowing ", 0, ". Is that alright?";
+"Following ", 0, ", trying not to get shot.";
+}
+
+ //the bot is defending something
+type "defending"
+{
+"I'm defending ", 0, ".";
+
+}
+
+ //the bot is going for an item
+type "gettingitem"
+{
+"I'm off to get the ", 0, ".";
+"The ", 0, " is going to be mine.";
+"Dibs on the ", 0, ".";
+}
+
+ //trying to kill someone
+type "killing"
+{
+"I've been trying to kill ", 0, ".";
+"Trying to wack ", 0, ".";
+}
+
+ //the bot is camping
+type "camping"
+{
+"Toasting marshmallows and sniping scum.";
+"Where I am supposed to be, camping.";
+"Sniping, just like you told me.";
+}
+
+ //the bot is patrolling
+type "patrolling"
+{
+"On patrol, can't talk now.";
+}
+
+ //the bot is capturing the flag
+type "capturingflag"
+{
+"Gots to get the flag.";
+}
+
+ //the bot is rushing to the base
+type "rushingbase"
+{
+"Rushing to the base.";
+}
+
+ //trying to return the flag
+type "returningflag"
+{
+"Getting the flag back.";
+}
+
+type "attackingenemybase"
+{
+"I'm destroying their base! Care to help?";
+"Wreaking havok in their base.";
+}
+
+type "harvesting"
+{
+"Collecting skulls, what are you doing?";
+}
+
+ //the bot is just roaming a bit
+type "roaming"
+{
+"Rambling around, fragging at whim.";
+"Mindlessly roaming around, like I was told.";
+"~Wacking fools piece-meal.";
+}
+
+type "wantoffence"
+{
+"Let me go on offense.";
+"Can I be on offense?";
+
+}
+
+type "wantdefence"
+{
+"I think I can handle the big D.";
+"Can I be on defense?";
+}
+
+ //the bot will keep the team preference in mind
+type "keepinmind"
+{
+"A'ight, ", 0," I'll keep it in mind.";
+
+}
+
+ //==========================
+ // teamplay chats
+ //==========================
+ //team mate killed the bot
+type "death_teammate"
+{
+"Same team, dumbass!";
+"Hey ", 0," I'm on your team... idiot!";
+"Why did you kill me?";
+}
+ //killed by a team mate
+type "kill_teammate"
+{
+"hehe... oops.";
+"Sorry!";
+"Oops, won't happen again.";
+}
+
+ //==========================
+ // CTF useless chats
+ //==========================
+
+ //team mate got the enemy flag
+type "ctf_gotflag"
+{
+"It's about time, ", 0, " now get that flag home!";
+}
+ //team mate gets the enemy flag to the base
+type "ctf_captureflag"
+{
+"Sweet, gj, ", 0, ".";
+}
+ //team mate returns the base flag
+type "ctf_returnflag"
+{
+"Nice assist, ", 0, ".";
+} //end type
+ //team mate defends the base
+type "ctf_defendbase"
+{
+"Nice D work there, ", 0, ".";
+}
+ //team mate carrying the enemy flag dies
+type "ctf_flagcarrierdeath"
+{
+"Go get our flag!";
+}
+ //team mate kills enemy with base flag
+type "ctf_flagcarrierkill"
+{
+"Yo, ", 0," get our flag now!";
+}
+
+ //==========================
+ // NOTE: make sure these work with match.c
+ //==========================
+ //ask who the team leader is
+type "whoisteamleader"
+{
+"Who's the leader of this rag-tag bunch?";
+}
+
+ //I am the team leader
+type "iamteamleader"
+{
+"I am the leader.";
+"I shall lead.";
+"I lead.";
+}
+ //defend the base command
+type "cmd_defendbase"
+{
+0, " defend our base.";
+0, " set up some D.";
+0, " you should defend our base.";
+}
+ //get the enemy flag command
+type "cmd_getflag"
+{
+"Yo, ", 0, " get the flag!";
+0, " get their flag.";
+0, " capture the other team's flag.";
+}
+ //accompany someone command
+type "cmd_accompany"
+{
+"Hey, ", 0, " shadow ", 1;
+0, " follow ", 1, ", ", 1, " needs the help.";
+
+}
+ //accompany me command
+type "cmd_accompanyme"
+{
+0, " you should follow me.";
+"Follow me please, ", 0, ".";
+}
+ //attack enemy base command
+type "cmd_attackenemybase"
+{
+0, " go after their base";
+}
+ //return the flag command
+type "cmd_returnflag"
+{
+0, " please return our flag!";
+0, " get our flag back, ASAP!";
+}
+ //go harvesting
+type "cmd_harvest"
+{
+0, ", you should collect some skulls.";
+}
+
+ //Double Domination stuff:
+type "dd_start_pointa"
+{
+"I'll dominate point A";
+}
+
+type "dd_start_pointb"
+{
+"I'll dominate point B";
+}
+
+type "dd_pointa"
+{
+"Dominating point A";
+}
+
+type "dd_pointb"
+{
+"Dominating point B";
+}
+
+//DD orders:
+type "cmd_takea"
+{
+0, " dominate point A";
+}
+
+type "cmd_takeb"
+{
+0, " dominate point B";
+}
\ No newline at end of file
diff --git a/base/botfiles/weapons.c b/base/botfiles/weapons.c
new file mode 100644
index 00000000..a6564620
--- /dev/null
+++ b/base/botfiles/weapons.c
@@ -0,0 +1,226 @@
+/*
+===========================================================================
+Copyright (C) 2006 Dmn_clown (aka: Bob Isaac (rjisaac@gmail.com))
+
+This file is part of Open Arena and is based upon Mr. Elusive's fuzzy logic
+system found in Quake 3 Arena.
+
+Open Arena is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Open Arena is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Foobar; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+#include "inv.h"
+
+#define IMPACT_DAMAGE 1 //straight impact damage
+#define SPLASH_DAMAGE 2 //splash damage
+
+projectileinfo
+{
+name "bfgexploision"
+damage 40
+radius 100
+damagetype $evalint(IMPACT_DAMAGE|SPLASH_DAMAGE)
+}
+
+weaponinfo
+{
+name "BFG10K"
+number WEAPONINDEX_BFG
+projectile "bfgexploision"
+numprojectiles 1
+speed 0
+}
+
+projectileinfo
+{
+name "gauntletdamage"
+damage 50
+damagetype IMPACT_DAMAGE
+}
+
+weaponinfo
+{
+name "Gauntlet"
+number WEAPONINDEX_GAUNTLET
+projectile "gauntletdamage"
+numprojectiles 1
+speed 0
+}
+
+projectileinfo
+{
+name "grenade"
+damage 120
+radius 160
+damagetype $evalint(IMPACT_DAMAGE|SPLASH_DAMAGE)
+}
+
+weaponinfo
+{
+name "Grenade Launcher"
+number WEAPONINDEX_GRENADE_LAUNCHER
+projectile "grenade"
+numprojectiles 1
+speed 700
+}
+
+
+projectileinfo
+{
+name "lightning"
+damage 24
+damagetype IMPACT_DAMAGE
+}
+
+weaponinfo
+{
+name "Lightning Gun"
+number WEAPONINDEX_LIGHTNING
+projectile "lightning"
+numprojectiles 1
+speed 0
+}
+
+
+projectileinfo
+{
+name "machinegunbullet"
+damage 8
+damagetype IMPACT_DAMAGE
+}
+
+weaponinfo
+{
+name "Machinegun"
+number WEAPONINDEX_MACHINEGUN
+projectile "machinegunbullet"
+numprojectiles 1
+speed 0
+}
+
+projectileinfo
+{
+name "plasma"
+damage 20
+radius 20
+damagetype $evalint(IMPACT_DAMAGE|SPLASH_DAMAGE)
+}
+
+weaponinfo
+{
+name "Plasma Gun"
+number WEAPONINDEX_PLASMAGUN
+projectile "plasma"
+numprojectiles 1
+speed 2000
+}
+
+projectileinfo
+{
+name "rail"
+damage 100
+damagetype IMPACT_DAMAGE
+}
+
+weaponinfo
+{
+name "Railgun"
+number WEAPONINDEX_RAILGUN
+projectile "rail"
+numprojectiles 1
+speed 0
+}
+
+projectileinfo
+{
+name "rocket"
+damage 100
+radius 120
+damagetype $evalint(IMPACT_DAMAGE|SPLASH_DAMAGE)
+}
+
+weaponinfo
+{
+name "Rocket Launcher"
+number WEAPONINDEX_ROCKET_LAUNCHER
+projectile "rocket"
+numprojectiles 1
+speed 900
+}
+
+
+projectileinfo
+{
+name "shotgunbullet"
+damage 10
+damagetype IMPACT_DAMAGE
+}
+
+weaponinfo
+{
+name "Shotgun"
+number WEAPONINDEX_SHOTGUN
+projectile "shotgunbullet"
+numprojectiles 11
+speed 0
+}
+
+projectileinfo
+{
+name "chaingunbullet"
+damage 7
+damagetype $evalint(IMPACT_DAMAGE)
+}
+
+weaponinfo
+{
+name "Chaingun"
+number WEAPONINDEX_CHAINGUN
+projectile "chaingunbullet"
+numprojectiles 1
+speed 0
+}
+
+projectileinfo
+{
+name "nail"
+damage 30
+damagetype $evalint(IMPACT_DAMAGE)
+}
+
+weaponinfo
+{
+name "Nailgun"
+number WEAPONINDEX_NAILGUN
+projectile "nail"
+numprojectiles 13
+speed 0
+}
+
+projectileinfo
+{
+name "mine"
+damage 0
+damagetype $evalint(SPLASH_DAMAGE)
+}
+
+weaponinfo
+{
+name "Prox Launcher"
+number WEAPONINDEX_PROXLAUNCHER
+projectile "mine"
+numprojectiles 1
+speed 0
+}
diff --git a/base/def/bot.def b/base/def/bot.def
new file mode 100644
index 00000000..5f53331b
--- /dev/null
+++ b/base/def/bot.def
@@ -0,0 +1,4 @@
+entityDef player_doommarine_mp_bot {
+ "inherit" "player_doommarine_mp"
+ "spawnclass" "rvmBot"
+}
\ No newline at end of file
diff --git a/base/def/items.def b/base/def/items.def
new file mode 100644
index 00000000..0ac4c854
--- /dev/null
+++ b/base/def/items.def
@@ -0,0 +1,538 @@
+/***********************************************************************
+
+ items
+
+***********************************************************************/
+
+// Everything in here must match dkbase/botfiles/inv.h!
+entityDef bot_itemtable {
+
+ "INVENTORY_NONE" "0"
+ "INVENTORY_ARMOR" "1"
+ "INVENTORY_GAUNTLET" "4"
+ "INVENTORY_SHOTGUN" "5"
+ "INVENTORY_MACHINEGUN" "6"
+ "INVENTORY_GRENADELAUNCHER" "7"
+ "INVENTORY_ROCKETLAUNCHER" "8"
+ "INVENTORY_LIGHTNING" "9"
+ "INVENTORY_RAILGUN" "10"
+ "INVENTORY_PLASMAGUN" "11"
+ "INVENTORY_BFG10K" "13"
+ "INVENTORY_GRAPPLINGHOOK" "14"
+ "INVENTORY_NAILGUN" "15"
+ "INVENTORY_PROXLAUNCHER" "16"
+ "INVENTORY_CHAINGUN" "17"
+ "INVENTORY_SHELLS" "18"
+ "INVENTORY_BULLETS" "19"
+ "INVENTORY_GRENADES" "20"
+ "INVENTORY_CELLS" "21"
+ "INVENTORY_LIGHTNINGAMMO" "22"
+ "INVENTORY_ROCKETS" "23"
+ "INVENTORY_SLUGS" "24"
+ "INVENTORY_BFGAMMO" "25"
+ "INVENTORY_NAILS" "26"
+ "INVENTORY_MINES" "27"
+ "INVENTORY_BELT" "28"
+ "INVENTORY_HEALTH" "29"
+ "INVENTORY_TELEPORTER" "30"
+ "INVENTORY_MEDKIT" "31"
+ "INVENTORY_KAMIKAZE" "32"
+ "INVENTORY_PORTAL" "33"
+ "INVENTORY_INVULNERABILITY" "34"
+ "INVENTORY_QUAD" "35"
+ "INVENTORY_ENVIRONMENTSUIT" "36"
+ "INVENTORY_HASTE" "37"
+ "INVENTORY_INVISIBILITY" "38"
+ "INVENTORY_REGEN" "39"
+ "INVENTORY_FLIGHT" "40"
+ "INVENTORY_SCOUT" "41"
+ "INVENTORY_GUARD" "42"
+ "INVENTORY_DOUBLER" "43"
+ "INVENTORY_AMMOREGEN" "44"
+ "INVENTORY_REDFLAG" "45"
+ "INVENTORY_BLUEFLAG" "46"
+ "INVENTORY_NEUTRALFLAG" "47"
+ "INVENTORY_REDCUBE" "48"
+ "INVENTORY_BLUECUBE" "49"
+
+ "MODELINDEX_DEFAULT" "0"
+ "MODELINDEX_ARMORSHARD" "1"
+ "MODELINDEX_ARMORCOMBAT" "2"
+ "MODELINDEX_ARMORBODY" "3"
+ "MODELINDEX_HEALTHSMALL" "4"
+ "MODELINDEX_HEALTH" "5"
+ "MODELINDEX_HEALTHLARGE" "6"
+ "MODELINDEX_HEALTHMEGA" "7"
+ "MODELINDEX_GAUNTLET" "8"
+ "MODELINDEX_SHOTGUN" "9"
+ "MODELINDEX_MACHINEGUN" "10"
+ "MODELINDEX_GRENADELAUNCHER" "11"
+ "MODELINDEX_ROCKETLAUNCHER" "12"
+ "MODELINDEX_LIGHTNING" "13"
+ "MODELINDEX_RAILGUN" "14"
+ "MODELINDEX_PLASMAGUN" "15"
+ "MODELINDEX_BFG10K" "16"
+ "MODELINDEX_GRAPPLINGHOOK" "17"
+ "MODELINDEX_SHELLS" "18"
+ "MODELINDEX_BULLETS" "19"
+ "MODELINDEX_GRENADES" "20"
+ "MODELINDEX_CELLS" "21"
+ "MODELINDEX_LIGHTNINGAMMO" "22"
+ "MODELINDEX_ROCKETS" "23"
+ "MODELINDEX_SLUGS" "24"
+ "MODELINDEX_BFGAMMO" "25"
+ "MODELINDEX_TELEPORTER" "26"
+ "MODELINDEX_MEDKIT" "27"
+ "MODELINDEX_QUAD" "28"
+ "MODELINDEX_ENVIRONMENTSUIT" "29"
+ "MODELINDEX_HASTE" "30"
+ "MODELINDEX_INVISIBILITY" "31"
+ "MODELINDEX_REGEN" "32"
+ "MODELINDEX_FLIGHT" "33"
+ "MODELINDEX_REDFLAG" "34"
+ "MODELINDEX_BLUEFLAG" "35"
+ "MODELINDEX_KAMIKAZE" "36"
+ "MODELINDEX_PORTAL" "37"
+ "MODELINDEX_INVULNERABILITY" "38"
+ "MODELINDEX_NAILS" "39"
+ "MODELINDEX_MINES" "40"
+ "MODELINDEX_BELT" "41"
+ "MODELINDEX_SCOUT" "42"
+ "MODELINDEX_GUARD" "43"
+ "MODELINDEX_DOUBLER" "44"
+ "MODELINDEX_AMMOREGEN" "45"
+ "MODELINDEX_NEUTRALFLAG" "46"
+ "MODELINDEX_REDCUBE" "47"
+ "MODELINDEX_BLUECUBE" "48"
+ "MODELINDEX_NAILGUN" "49"
+ "MODELINDEX_PROXLAUNCHER" "50"
+ "MODELINDEX_CHAINGUN" "51"
+ "MODELINDEX_POINTABLUE" "52"
+ "MODELINDEX_POINTBBLUE" "53"
+ "MODELINDEX_POINTARED" "54"
+ "MODELINDEX_POINTBRED" "55"
+ "MODELINDEX_POINTAWHITE" "56"
+ "MODELINDEX_POINTBWHITE" "57"
+ "MODELINDEX_POINTWHITE" "58"
+ "MODELINDEX_POINTRED" "59"
+ "MODELINDEX_POINTBLUE" "60"
+
+ "WEAPONINDEX_GAUNTLET" "1"
+ "WEAPONINDEX_MACHINEGUN" "2"
+ "WEAPONINDEX_SHOTGUN" "3"
+ "WEAPONINDEX_GRENADE_LAUNCHER" "4"
+ "WEAPONINDEX_ROCKET_LAUNCHER" "5"
+ "WEAPONINDEX_LIGHTNING" "6"
+ "WEAPONINDEX_RAILGUN" "7"
+ "WEAPONINDEX_PLASMAGUN" "8"
+ "WEAPONINDEX_BFG" "9"
+ "WEAPONINDEX_GRAPPLING_HOOK" "10"
+ "WEAPONINDEX_NAILGUN" "11"
+ "WEAPONINDEX_PROXLAUNCHER" "12"
+ "WEAPONINDEX_CHAINGUN" "13"
+
+};
+
+entityDef item_default {
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+ "editor_rotatable" "1"
+
+ "inv_item" "1"
+ "snd_acquire" "sound_item_acquire"
+ "snd_respawn" "sound_item_respawn"
+
+ "editor_bool inv_item" "if set to 1, show item acquisition gui when picked up"
+ "editor_var inv_name" "name referenced for triggers etc.. requiring this to be in inventory to work"
+ "editor_var inv_icon" "icon name for hud graphics"
+ "editor_bool inv_carry" "if set to 1, is carried as opposed to instant use"
+ "editor_bool no_touch" "trigger to give to player instead of picking up"
+ "editor_bool not_easy" "set to 1 and item will not spawn in easy mode"
+ "editor_bool not_medium" "set to 1 and item will not spawn in medium mode"
+ "editor_bool not_hard" "set to 1 and item will not spawn in hard mode"
+ "editor_model model" "visual model"
+ "editor_var triggersize" "amount to expand the pickup trigger by"
+ "editor_var inv_id" "id number as defined in guis/itemdefs.h"
+ "editor_copy3" "inv_name"
+ "editor_copy4" "inv_item"
+ "editor_copy5" "inv_objective"
+ "editor_copy6" "inv_icon"
+
+ "modelindex" "MODELINDEX_DEFAULT"
+
+ "spawnclass" "idItem"
+}
+
+entityDef item_generic {
+ "inherit" "item_default"
+ "inv_item" "1"
+ "inv_name" "Item"
+}
+
+entityDef item_armor_security {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Security Armor"
+
+ "spawnclass" "idItem"
+ "model" "models/items/armor/armor.lwo"
+ "snd_acquire" "sound_vest_acquire"
+ "size" "32 32 32"
+ "inv_name" "Security Armor"
+ "inv_armor" "50"
+
+ "modelindex" "MODELINDEX_ARMORBODY"
+}
+
+entityDef item_armor_shard {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Armor shard"
+
+ "spawnclass" "idItem"
+ "model" "models/items/armor/armor_shard.lwo"
+ "snd_acquire" "sound_shard_acquire"
+ "size" "32 32 32"
+ "inv_name" "Armor Shard"
+ "inv_armor" "5"
+
+ "modelindex" "MODELINDEX_ARMORSHARD"
+}
+
+
+entityDef item_key_blue {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Blue Key"
+ "editor_model" "models/items/keycard/keycard3.lwo"
+
+ "spawnclass" "idItem"
+ "model" "models/items/keycard/keycard3.lwo"
+ "size" "32 32 32"
+ "inv_carry" "1"
+ "inv_name" "Blue Key"
+ "inv_id_bluekey" "1"
+ "inv_item" "1"
+ "snd_acquire" "guisounds_item"
+}
+
+entityDef item_key_red {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Red Key"
+ "editor_model" "models/items/keycard/keycard2.lwo"
+
+ "spawnclass" "idItem"
+ "model" "models/items/keycard/keycard2.lwo"
+ "size" "32 32 32"
+ "inv_carry" "1"
+ "inv_name" "Red Key"
+ "inv_id_redkey" "1"
+ "inv_item" "1"
+ "snd_acquire" "guisounds_item"
+}
+
+entityDef item_key_yellow {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Yellow Key"
+ "editor_model" "models/items/keycard/keycard.lwo"
+
+ "spawnclass" "idItem"
+ "model" "models/items/keycard/keycard.lwo"
+ "size" "32 32 32"
+ "inv_carry" "1"
+ "inv_name" "Yellow Key"
+ "inv_id_redkey" "1"
+ "inv_item" "1"
+ "snd_acquire" "guisounds_item"
+}
+
+entityDef item_keycard_generic {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Keycard"
+ "editor_model" "models/items/keycard/keycard.lwo"
+
+ "spawnclass" "idItem"
+ "model" "models/items/keycard/keycard.lwo"
+ "size" "32 32 32"
+ "inv_carry" "1"
+ "inv_name" "Keycard"
+ "inv_id_redkey" "1"
+ "inv_item" "1"
+ "snd_acquire" "guisounds_item"
+}
+
+entityDef item_keycard_aco {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "ACO Keycard"
+ "editor_model" "models/items/keycard/keycard3.lwo"
+
+ "spawnclass" "idItem"
+ "model" "models/items/keycard/keycard3.lwo"
+ "size" "32 32 32"
+ "inv_carry" "1"
+ "inv_name" "ACO Keycard"
+ "inv_id_bluekey" "1"
+ "inv_item" "1"
+ "snd_acquire" "guisounds_item"
+}
+
+
+entityDef item_data_linker {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Data Linker"
+
+ "spawnclass" "idItem"
+ "model" "models/items/data_linker/data_linker.ase"
+ "size" "32 32 32"
+ "inv_carry" "1"
+ "inv_name" "Data Linker"
+ "inv_id_datalinker" "1"
+ "inv_item" "1"
+ "snd_acquire" "guisounds_item"
+}
+
+entityDef item_health {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Large Med Kit"
+
+ "spawnclass" "idItem"
+ "model" "models/items/health/large_cross.mdr"
+ "size" "32 32 32"
+ "inv_name" "Med Kit"
+ "inv_health" "25"
+ "inv_item" "2"
+ "snd_acquire" "guisounds_health"
+
+ "modelindex" "MODELINDEX_HEALTHLARGE"
+}
+
+entityDef item_health_small {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Small Med Kit"
+
+ "spawnclass" "idItem"
+ "model" "models/items/health/small_cross.mdr"
+ "size" "32 32 32"
+ "inv_name" "Med Kit"
+ "inv_health" "15"
+ "inv_item" "2"
+ "snd_acquire" "guisounds_health"
+
+ "modelindex" "MODELINDEX_HEALTH"
+}
+
+// The proper spelling is with 1 n, but a lot of the assets have it spelled with 2 so be aware when looking for media.
+entityDef item_aircannister {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Air Canister"
+
+ "spawnclass" "idItem"
+ "model" "models/items/aircannister/aircannister.lwo"
+ "size" "32 32 32"
+ "inv_name" "Air Canister"
+ "inv_air" "50"
+ "inv_item" "6"
+ "snd_acquire" "air_cannister_pickup"
+}
+
+entityDef item_battery {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Battery"
+
+ "spawnclass" "idItem"
+ "model" "models/items/battery/battery.ase"
+ "size" "32 32 32"
+ "inv_name" "Batteries"
+ "inv_battery" "100"
+ "inv_item" "7"
+ "snd_acquire" "guisounds_item"
+}
+
+
+entityDef item_videocd {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Video Disk"
+ "editor_var video" "name of the .video file to give to the player"
+
+ "spawnclass" "idVideoCDItem"
+ "model" "models/items/videocd/videocd_world.lwo"
+ "size" "32 32 32"
+ "inv_name" "Video Disk"
+ "video" "pdas/video/testmap.video"
+ "inv_carry" "1"
+ "inv_item" "1"
+ "snd_acquire" "videocd_pickup"
+ "editor_copy101" "video"
+}
+
+entityDef item_backpack {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+
+ "editor_usage" "Backpack. Gives player multiple items at once. Empty by default, so designer must choose amounts."
+
+ "editor_var inv_ammo_bullets" "gives pistol ammo"
+ "editor_var inv_ammo_shells" "gives shotgun ammo"
+ "editor_var inv_ammo_clip" "gives machine gun ammo"
+ "editor_var inv_ammo_grenades" "gives grenade ammo"
+ "editor_var inv_ammo_rockets" "gives rocket launcher ammo"
+ "editor_var inv_ammo_cells" "gives plasmagun ammo"
+ "editor_var inv_ammo_belt" "gives chaingun ammo"
+ "editor_var inv_ammo_bfg" "gives bfg ammo"
+ "editor_var inv_health" "gives health"
+ "editor_var inv_armor" "gives armor"
+ "editor_var inv_air" "gives air"
+
+ "spawnclass" "idItem"
+ "model" "models/items/powerups/backpack.lwo"
+ "size" "32 32 32"
+ "inv_name" "Backpack"
+ "inv_item" "4"
+ "snd_acquire" "pack_pickup"
+
+ "editor_copy3" ""
+ "editor_copy4" ""
+ "editor_copy5" ""
+ "editor_copy6" ""
+
+ "inv_ammo_bullets" "0"
+ "inv_ammo_shells" "0"
+ "inv_ammo_clip" "0"
+ "inv_ammo_grenades" "0"
+ "inv_ammo_rockets" "0"
+ "inv_ammo_cells" "0"
+ "inv_ammo_belt" "0"
+ "inv_ammo_bfg" "0"
+ "inv_health" "0"
+ "inv_armor" "0"
+ "inv_air" "0"
+
+ "editor_copy201" "inv_ammo_bullets"
+ "editor_copy202" "inv_ammo_shells"
+ "editor_copy203" "inv_ammo_clip"
+ "editor_copy204" "inv_ammo_grenades"
+ "editor_copy205" "inv_ammo_rockets"
+ "editor_copy206" "inv_ammo_cells"
+ "editor_copy207" "inv_ammo_belt"
+ "editor_copy208" "inv_ammo_bfg"
+ "editor_copy209" "inv_health"
+ "editor_copy210" "inv_armor"
+ "editor_copy211" "inv_air"
+}
+
+// move to misc
+entityDef item_objective {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-4 -4 -4"
+ "editor_maxs" "4 4 4"
+
+ "editor_usage" "Gives the player an objective, trigger it to give the objective."
+
+ "editor_bool inv_objective" "1 means show objective window"
+ "editor_var camShot" "name of the entity to take the screen shot from"
+ "editor_var screenShot" "image name to save shot to"
+ "editor_var objectivetext" "objective description"
+ "editor_var objectivetitle" "objective title"
+ "editor_var inv_name" "name of inventory/objective item used for requirements"
+
+ "spawnclass" "idObjective"
+ "inv_objective" "1"
+}
+
+// move to misc
+entityDef item_objectivecomplete {
+ "inherit" "item_default"
+ "editor_color" ".3 .3 1"
+ "editor_mins" "-4 -4 -4"
+ "editor_maxs" "4 4 4"
+
+ "editor_usage" "Completes a named objective, trigger it to complete the objective."
+
+ "editor_bool inv_objective" "1 means show objective window"
+ "editor_var camShot" "name of the entity to take the screen shot from"
+ "editor_var screenShot" "image name to save shot to"
+ "editor_var objectivetext" "objective description"
+ "editor_var objectivetitle" "objective title"
+ "editor_var remove" "inventory object to remove if one was required"
+ "editor_var inv_name" "name of inventory/objective item to be completed"
+
+ "spawnclass" "idObjectiveComplete"
+ "inv_objective" "1"
+}
+
+entityDef item_pda {
+ "inherit" "item_default"
+ "model" "models/items/pda/pda_world.lwo"
+ "size" "32 32 32"
+
+ "editor_usage" "PDA"
+ "editor_usage1" "PDA's contain vidoes, audio, e-mail, and security clearances."
+ "editor_var inv_name" "This name is used on trigger requires. It does not need to match the name as defined in the .pda file"
+ "editor_var pda_name" "name of pda as defined in the .pda file"
+
+ "inv_name" "PDA"
+ "inv_carry" "1"
+ "inv_pda" "1"
+ "inv_item" "1"
+ "snd_acquire" "guisounds_compup"
+
+ "editor_color" ".0 .3 1"
+ "editor_mins" "-16 -16 0"
+ "editor_maxs" "16 16 32"
+ "spawnclass" "idPDAItem"
+
+ "dropToFloor" "1"
+}
diff --git a/neo/doom3/game.vcxproj b/neo/doom3/game.vcxproj
index cd700987..9cd44b21 100644
--- a/neo/doom3/game.vcxproj
+++ b/neo/doom3/game.vcxproj
@@ -339,6 +339,10 @@ typeinfo.exe
+
+
+
+
@@ -350,6 +354,22 @@ typeinfo.exe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -436,10 +456,20 @@ typeinfo.exe
+
+
+
+
+
+
+
+
+
+
diff --git a/neo/doom3/game.vcxproj.filters b/neo/doom3/game.vcxproj.filters
index 1a594c70..0e91f307 100644
--- a/neo/doom3/game.vcxproj.filters
+++ b/neo/doom3/game.vcxproj.filters
@@ -19,6 +19,9 @@
{12aff2d0-4c6d-4e10-825f-fd89f869b61d}
+
+ {a359e51b-8a70-46de-96ca-438d29288f69}
+
@@ -216,6 +219,66 @@
GameSys
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ AI
+
+
+ AI
+
+
+ AI
+
+
+ AI
+
@@ -395,6 +458,36 @@
GameSys
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ Bots
+
+
+ AI
+
+
+ AI
+
+
+ AI
+
+
+ AI
+
diff --git a/neo/doom3/game/Actor.cpp b/neo/doom3/game/Actor.cpp
index 7103190c..8d7d42e1 100644
--- a/neo/doom3/game/Actor.cpp
+++ b/neo/doom3/game/Actor.cpp
@@ -3256,6 +3256,12 @@ idActor::Event_SetState
=====================
*/
void idActor::Event_SetState( const char *name ) {
+ if (HasNativeFunction(name))
+ {
+ stateThread.SetState(name);
+ return;
+ }
+
idealState = GetScriptFunction( name );
if ( idealState == state ) {
state = NULL;
diff --git a/neo/doom3/game/Actor.h b/neo/doom3/game/Actor.h
index 99a4f918..ef17f7bd 100644
--- a/neo/doom3/game/Actor.h
+++ b/neo/doom3/game/Actor.h
@@ -252,6 +252,8 @@ protected:
idAnimState torsoAnim;
idAnimState legsAnim;
+ rvStateThread stateThread;
+
bool allowPain;
bool allowEyeFocus;
bool finalBoss;
diff --git a/neo/doom3/game/Entity.h b/neo/doom3/game/Entity.h
index 790f5f66..76175cef 100644
--- a/neo/doom3/game/Entity.h
+++ b/neo/doom3/game/Entity.h
@@ -395,6 +395,8 @@ public:
{
return GetLocalCoordinates(GetPhysics()->GetOrigin());
}
+
+ virtual void InflictedDamageEvent(idEntity* target) {}
protected:
renderEntity_t renderEntity; // used to present a model to the renderer
int modelDefHandle; // handle to static renderer model
diff --git a/neo/doom3/game/Game.h b/neo/doom3/game/Game.h
index ed128771..80b32523 100644
--- a/neo/doom3/game/Game.h
+++ b/neo/doom3/game/Game.h
@@ -118,7 +118,7 @@ public:
virtual void CacheDictionaryMedia( const idDict *dict ) = 0;
// Spawns the player entity to be used by the client.
- virtual void SpawnPlayer( int clientNum ) = 0;
+ virtual void SpawnPlayer( int clientNum, bool isBot ) = 0;
// Runs a game frame, may return a session command for level changing, etc
virtual gameReturn_t RunFrame( const usercmd_t *clientCmds ) = 0;
@@ -146,7 +146,9 @@ public:
virtual void ServerClientConnect( int clientNum, const char *guid ) = 0;
// Spawns the player entity to be used by the client.
- virtual void ServerClientBegin( int clientNum ) = 0;
+ virtual void ServerClientBegin( int clientNum, bool isBot ) = 0;
+
+ virtual bool GetRandomBotName(int clientNum, idStr& botName) = 0;
// Disconnects a client and removes the player entity from the game.
virtual void ServerClientDisconnect( int clientNum ) = 0;
diff --git a/neo/doom3/game/Game_local.cpp b/neo/doom3/game/Game_local.cpp
index 425519a2..fc588f8c 100644
--- a/neo/doom3/game/Game_local.cpp
+++ b/neo/doom3/game/Game_local.cpp
@@ -316,6 +316,19 @@ void idGameLocal::Init( void ) {
kv = dict->MatchPrefix( "type", kv );
}
+ // load in the bot itemtable.
+ botItemTable = FindEntityDef("bot_itemtable", false);
+ if (botItemTable == NULL)
+ {
+ common->FatalError("Failed to find bot_itemtable decl!\n");
+ }
+
+ // init all the bot systems.
+ botCharacterStatsManager.Init();
+ botFuzzyWeightManager.Init();
+ botWeaponInfoManager.Init();
+ botGoalManager.BotSetupGoalAI();
+
gamestate = GAMESTATE_NOMAP;
Printf( "...%d aas types\n", aasList.Num() );
@@ -909,6 +922,13 @@ void idGameLocal::LoadMap( const char *mapName, int randseed ) {
spawnArgs.Clear();
+ for (int i = 0; i < aasNames.Num(); i++)
+ {
+ aasList[i]->Init(idStr(mapFileName).SetFileExtension(aasNames[i]).c_str(), mapFile->GetGeometryCRC());
+ }
+
+ bot_aas = GetAAS("aas48");
+
skipCinematic = false;
inCinematic = false;
cinematicSkipTime = 0;
@@ -1186,6 +1206,11 @@ void idGameLocal::InitFromNewMap( const char *mapName, idRenderWorld *renderWorl
// free up any unused animations
animationLib.FlushUnusedAnims();
+ if (isMultiplayer && isServer)
+ {
+ botGoalManager.InitLevelItems();
+ }
+
gamestate = GAMESTATE_ACTIVE;
Printf( "--------------------------------------\n" );
@@ -1821,7 +1846,7 @@ void idGameLocal::InitScriptForMap( void ) {
idGameLocal::SpawnPlayer
============
*/
-void idGameLocal::SpawnPlayer( int clientNum ) {
+void idGameLocal::SpawnPlayer( int clientNum, bool isBot ) {
idEntity *ent;
idDict args;
@@ -1830,7 +1855,14 @@ void idGameLocal::SpawnPlayer( int clientNum ) {
args.SetInt( "spawn_entnum", clientNum );
args.Set( "name", va( "player%d", clientNum + 1 ) );
- args.Set( "classname", isMultiplayer ? "player_doommarine_mp" : "player_doommarine" );
+ if (isBot)
+ {
+ args.Set("classname", "player_doommarine_mp_bot");
+ }
+ else
+ {
+ args.Set("classname", isMultiplayer ? "player_doommarine_mp" : "player_doommarine");
+ }
if ( !SpawnEntityDef( args, &ent ) || !entities[ clientNum ] ) {
Error( "Failed to spawn player as '%s'", args.GetString( "classname" ) );
}
@@ -2169,6 +2201,11 @@ gameReturn_t idGameLocal::RunFrame( const usercmd_t *clientCmds ) {
}
#endif
+ if (isMultiplayer && isServer)
+ {
+ RunBotFrame();
+ }
+
player = GetLocalPlayer();
for (int i = 0; i < delayRemoveEntities.Num(); i++)
diff --git a/neo/doom3/game/Game_local.h b/neo/doom3/game/Game_local.h
index c1844288..178a36c3 100644
--- a/neo/doom3/game/Game_local.h
+++ b/neo/doom3/game/Game_local.h
@@ -340,7 +340,8 @@ public:
virtual void SaveGame( idFile *saveGameFile );
virtual void MapShutdown( void );
virtual void CacheDictionaryMedia( const idDict *dict );
- virtual void SpawnPlayer( int clientNum );
+ virtual void SpawnPlayer( int clientNum, bool isBot );
+ virtual bool GetRandomBotName(int clientNum, idStr& botName);
virtual gameReturn_t RunFrame( const usercmd_t *clientCmds );
virtual bool Draw( int clientNum );
virtual escReply_t HandleESC( idUserInterface **gui );
@@ -349,7 +350,7 @@ public:
virtual void HandleMainMenuCommands( const char *menuCommand, idUserInterface *gui );
virtual allowReply_t ServerAllowClient( int numClients, const char *IP, const char *guid, const char *password, char reason[MAX_STRING_CHARS] );
virtual void ServerClientConnect( int clientNum, const char *guid );
- virtual void ServerClientBegin( int clientNum );
+ virtual void ServerClientBegin( int clientNum, bool isBot);
virtual void ServerClientDisconnect( int clientNum );
virtual void ServerWriteInitialReliableMessages( int clientNum );
virtual void ServerWriteSnapshot( int clientNum, int sequence, idBitMsg &msg, byte *clientInPVS, int numPVSClients );
@@ -378,6 +379,9 @@ public:
void DelayRemoveEntity(idEntity* entity, int delay);
+ void AddBot(void);
+ idPlayer* GetClient(int i) const { assert(i >= 0 && i < MAX_CLIENTS); return reinterpret_cast(entities[i]); }
+
void LocalMapRestart( void );
void MapRestart( void );
static void MapRestart_f( const idCmdArgs &args );
@@ -389,6 +393,17 @@ public:
{
return MS2SEC(time - previousTime);
}
+
+ idAAS* GetBotAAS(void)
+ {
+ return bot_aas;
+ }
+
+ int TravelTimeToGoal(const idVec3& origin, const idVec3& goal);
+ int GetBotItemEntry(const char* name);
+ void Trace(trace_t& results, const idVec3& start, const idVec3& end, int contentMask, int passEntity);
+ void AlertBots(idPlayer* player, idVec3 alert_position);
+
bool NextMap( void ); // returns wether serverinfo settings have been modified
static void NextMap_f( const idCmdArgs &args );
@@ -457,6 +472,8 @@ public:
const idVec3 & GetGravity( void ) const;
+ void RunBotFrame(void);
+
// added the following to assist licensees with merge issues
int GetFrameNum() const { return framenum; };
int GetTime() const { return time; };
@@ -593,6 +610,8 @@ private:
void GetMapLoadingGUI( char gui[ MAX_STRING_CHARS ] );
idList delayRemoveEntities;
+ const idDeclEntityDef* botItemTable;
+ idAAS* bot_aas;
};
//============================================================================
@@ -703,6 +722,7 @@ typedef enum {
#define MASK_OPAQUE (CONTENTS_OPAQUE)
#define MASK_SHOT_RENDERMODEL (CONTENTS_SOLID|CONTENTS_RENDERMODEL)
#define MASK_SHOT_BOUNDINGBOX (CONTENTS_SOLID|CONTENTS_BODY)
+#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE)
const float DEFAULT_GRAVITY = 1066.0f;
#define DEFAULT_GRAVITY_STRING "1066"
@@ -777,4 +797,6 @@ const int CINEMATIC_SKIP_DELAY = SEC2MS( 2.0f );
#include "weapons/Weapon_chainsaw.h"
#include "weapons/Weapon_grabber.h"
+#include "bots/Bot.h"
+
#endif /* !__GAME_LOCAL_H__ */
diff --git a/neo/doom3/game/Game_network.cpp b/neo/doom3/game/Game_network.cpp
index d050eac8..a2c7cb1a 100644
--- a/neo/doom3/game/Game_network.cpp
+++ b/neo/doom3/game/Game_network.cpp
@@ -303,7 +303,7 @@ void idGameLocal::ServerClientConnect( int clientNum, const char *guid ) {
idGameLocal::ServerClientBegin
================
*/
-void idGameLocal::ServerClientBegin( int clientNum ) {
+void idGameLocal::ServerClientBegin( int clientNum, bool isBot ) {
idBitMsg outMsg;
byte msgBuf[MAX_GAME_MESSAGE_SIZE];
@@ -317,7 +317,7 @@ void idGameLocal::ServerClientBegin( int clientNum ) {
networkSystem->ServerSendReliableMessage( clientNum, outMsg );
// spawn the player
- SpawnPlayer( clientNum );
+ SpawnPlayer( clientNum, isBot );
if ( clientNum == localClientNum ) {
mpGame.EnterGame( clientNum );
}
@@ -331,6 +331,16 @@ void idGameLocal::ServerClientBegin( int clientNum ) {
networkSystem->ServerSendReliableMessage( -1, outMsg );
}
+/*
+================
+idGameLocal::GetRandomBotName
+================
+*/
+bool idGameLocal::GetRandomBotName(int clientNum, idStr& botName) {
+ botName = "TestBot";
+ return true;
+}
+
/*
================
idGameLocal::ServerClientDisconnect
@@ -1325,7 +1335,7 @@ void idGameLocal::ClientProcessReliableMessage( int clientNum, const idBitMsg &m
int client = msg.ReadByte();
int spawnId = msg.ReadLong();
if ( !entities[ client ] ) {
- SpawnPlayer( client );
+ SpawnPlayer( client, false );
entities[ client ]->FreeModelDef();
}
// fix up the spawnId to match what the server says
@@ -1751,3 +1761,152 @@ void idEventQueue::Enqueue( entityNetEvent_t *event, outOfOrderBehaviour_t behav
}
end = event;
}
+
+/*
+======================
+idGameLocal::RunBotFrame
+======================
+*/
+void idGameLocal::RunBotFrame(void) {
+ for (int i = 0; i < MAX_CLIENTS; i++) {
+ idPlayer* botPlayer = GetClient(i);
+
+ if (botPlayer == NULL) {
+ continue;
+ }
+
+ rvmBot* bot = botPlayer->Cast< rvmBot >();
+
+ if (bot == NULL) {
+ continue;
+ }
+
+ bot->BotInputFrame();
+ }
+}
+
+/*
+======================
+idGameLocal::AddBot
+======================
+*/
+void idGameLocal::AddBot(void) {
+ int clientNum;
+
+ if (aasList.Num() == 0) {
+ common->Warning("idGameLocal::AddBot: No AAS file loaded for map\n");
+ return;
+ }
+
+ clientNum = networkSystem->AllocateClientSlotForBot(8);
+ if (clientNum == -1) {
+ return;
+ }
+
+ // idPlayer* newPlayer = gameLocal.GetClient(clientNum);
+}
+
+
+/*
+================
+idGameLocal::TravelTimeToGoal
+================
+*/
+int idGameLocal::TravelTimeToGoal(const idVec3& origin, const idVec3& goal)
+{
+ idAAS* aas = bot_aas;
+
+ if (aas == NULL)
+ {
+ gameLocal.Error("idGameLocal::TraveTimeToGoal: No AAS loaded...\n");
+ return NULL;
+ }
+ //int originArea = aas->PointAreaNum(origin);
+ //idVec3 _goal = goal;
+ //int goalArea = aas->AdjustPositionAndGetArea(_goal);
+ //return aas->TravelTimeToGoalArea(originArea, origin, goalArea, TFL_WALK);
+
+ idVec3 org = origin;
+ int curAreaNum = aas->AdjustPositionAndGetArea(org);
+ int goalArea = aas->PointAreaNum(goal);
+ int travelTime;
+ idReachability* reach;
+ if (!aas->RouteToGoalArea(curAreaNum, org, goalArea, TFL_WALK | TFL_AIR, travelTime, &reach))
+ {
+ return NULL;
+ }
+
+ //int goalArea = aas->PointAreaNum(goal);
+ //aas->ShowWalkPath(origin, goalArea, goal);
+
+ return travelTime;
+}
+
+/*
+===============
+idGameLocal::GetBotItemEntry
+===============
+*/
+int idGameLocal::GetBotItemEntry(const char* name)
+{
+ const idKeyValue* keyvalue = botItemTable->dict.FindKey(name);
+ if (!keyvalue)
+ {
+ gameLocal.Warning("GetBotItemModelIndex: Doesn't have key %s\n", name);
+ return 9;
+ }
+
+ return botItemTable->dict.GetInt(name);
+}
+
+/*
+===============
+idGameLocal::Trace
+===============
+*/
+void idGameLocal::Trace(trace_t& results, const idVec3& start, const idVec3& end, int contentMask, int passEntity)
+{
+ idMat3 axis;
+ axis.Identity();
+
+ if (passEntity == -1)
+ {
+ clip.Translation(results, start, end, NULL, axis, CONTENTS_SOLID, NULL);
+ }
+ else
+ {
+ clip.Translation(results, start, end, NULL, axis, CONTENTS_SOLID, entities[passEntity]);
+ }
+}
+
+/*
+===================
+idGameLocal::AlertBots
+===================
+*/
+void idGameLocal::AlertBots(idPlayer* player, idVec3 alert_position)
+{
+ for (int i = 0; i < MAX_CLIENTS; i++)
+ {
+ rvmBot* bot = NULL;
+
+ if (entities[i] == NULL)
+ {
+ continue;
+ }
+
+ bot = entities[i]->Cast();
+ if (bot == NULL)
+ {
+ continue;
+ }
+
+ trace_t tr;
+ Trace(tr, alert_position, bot->GetRenderEntity()->origin, CONTENTS_SOLID, 0);
+
+ if (tr.fraction == 1.0f)
+ {
+ bot->SetEnemy(player, player->GetOrigin());
+ }
+ }
+}
\ No newline at end of file
diff --git a/neo/doom3/game/Item.cpp b/neo/doom3/game/Item.cpp
index bfb0d3aa..baff28d4 100644
--- a/neo/doom3/game/Item.cpp
+++ b/neo/doom3/game/Item.cpp
@@ -288,6 +288,8 @@ void idItem::Spawn( void ) {
GetPhysics()->SetContents( CONTENTS_TRIGGER );
}
+ modelindex = gameLocal.GetBotItemEntry(spawnArgs.GetString("modelindex"));
+
giveTo = spawnArgs.GetString( "owner" );
if ( giveTo.Length() ) {
ent = gameLocal.FindEntity( giveTo );
diff --git a/neo/doom3/game/Item.h b/neo/doom3/game/Item.h
index 9ead4f1c..fe1ccbac 100644
--- a/neo/doom3/game/Item.h
+++ b/neo/doom3/game/Item.h
@@ -55,6 +55,12 @@ public:
virtual void Think( void );
virtual void Present();
+
+ int GetModelIndex() const
+ {
+ return modelindex;
+ }
+
enum {
EVENT_PICKUP = idEntity::EVENT_MAXEVENTS,
EVENT_RESPAWN,
@@ -75,6 +81,8 @@ private:
bool pulse;
bool canPickUp;
+ int modelindex;
+
// for item pulse effect
int itemShellHandle;
const idMaterial * shellMaterial;
diff --git a/neo/doom3/game/Player.cpp b/neo/doom3/game/Player.cpp
index d8771bb9..738c48ef 100644
--- a/neo/doom3/game/Player.cpp
+++ b/neo/doom3/game/Player.cpp
@@ -6819,6 +6819,11 @@ void idPlayer::Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &di
int oldHealth = health;
health -= damage;
+ if (attacker->IsType(rvmBot::Type))
+ {
+ attacker->InflictedDamageEvent(this);
+ }
+
if ( health <= 0 ) {
if ( health < -999 ) {
@@ -8519,3 +8524,36 @@ bool idPlayer::NeedsIcon( void ) {
// local clients don't render their own icons... they're only info for other clients
return entityNumber != gameLocal.localClientNum && ( isLagged || isChatting );
}
+
+/*
+===============
+idPlayer::GetViewHeight
+==============
+*/
+float idPlayer::GetViewHeight(void)
+{
+ float newEyeOffset = 0;
+
+ if (spectating)
+ {
+ newEyeOffset = 0.0f;
+ }
+ else if (health <= 0)
+ {
+ newEyeOffset = pm_deadviewheight.GetFloat();
+ }
+ else if (physicsObj.IsCrouching())
+ {
+ newEyeOffset = pm_crouchviewheight.GetFloat();
+ }
+ else if (GetBindMaster() && GetBindMaster()->IsType(idAFEntity_Vehicle::Type))
+ {
+ newEyeOffset = 0.0f;
+ }
+ else
+ {
+ newEyeOffset = pm_normalviewheight.GetFloat();
+ }
+
+ return newEyeOffset;
+}
\ No newline at end of file
diff --git a/neo/doom3/game/Player.h b/neo/doom3/game/Player.h
index a0bef353..7886fbb8 100644
--- a/neo/doom3/game/Player.h
+++ b/neo/doom3/game/Player.h
@@ -338,7 +338,7 @@ public:
void SetupWeaponEntity( void );
void SelectInitialSpawnPoint( idVec3 &origin, idAngles &angles );
void SpawnFromSpawnSpot( void );
- void SpawnToPoint( const idVec3 &spawn_origin, const idAngles &spawn_angles );
+ virtual void SpawnToPoint( const idVec3 &spawn_origin, const idAngles &spawn_angles );
void SetClipModel( void ); // spectator mode uses a different bbox size
void SavePersistantInfo( void );
@@ -512,6 +512,19 @@ public:
bool SelfSmooth( void );
void SetSelfSmooth( bool b );
+ virtual bool IsBot(void)
+ {
+ return false;
+ }
+
+ bool IsShooting(void)
+ {
+ return AI_ATTACK_HELD;
+ }
+
+ float GetViewHeight(void);
+
+ idStr netname;
private:
jointHandle_t hipJoint;
jointHandle_t chestJoint;
diff --git a/neo/doom3/game/ai/AAS.cpp b/neo/doom3/game/ai/AAS.cpp
index d9e93729..579cc8f5 100644
--- a/neo/doom3/game/ai/AAS.cpp
+++ b/neo/doom3/game/ai/AAS.cpp
@@ -273,3 +273,16 @@ void idAASLocal::GetEdge( int edgeNum, idVec3 &start, idVec3 &end ) const {
start = file->GetVertex( v[INTSIGNBITSET(edgeNum)] );
end = file->GetVertex( v[INTSIGNBITNOTSET(edgeNum)] );
}
+
+
+/*
+============
+idAASLocal::AdjustPositionAndGetArea
+============
+*/
+int idAASLocal::AdjustPositionAndGetArea(idVec3& origin)
+{
+ int area = PointReachableAreaNum(origin, DefaultSearchBounds(), AREA_REACHABLE_WALK);
+ PushPointIntoAreaNum(area, origin);
+ return area;
+}
\ No newline at end of file
diff --git a/neo/doom3/game/ai/AAS.h b/neo/doom3/game/ai/AAS.h
index d169d70b..943b3ff5 100644
--- a/neo/doom3/game/ai/AAS.h
+++ b/neo/doom3/game/ai/AAS.h
@@ -67,7 +67,7 @@ typedef struct aasObstacle_s {
class idAASCallback {
public:
virtual ~idAASCallback() {};
- virtual bool TestArea( const class idAAS *aas, int areaNum ) = 0;
+ virtual bool AreaIsGoal( const class idAAS *aas, int areaNum ) = 0;
};
typedef int aasHandle_t;
@@ -136,6 +136,11 @@ public:
virtual void ShowFlyPath( const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin ) const = 0;
// Find the nearest goal which satisfies the callback.
virtual bool FindNearestGoal( aasGoal_t &goal, int areaNum, const idVec3 origin, const idVec3 &target, int travelFlags, aasObstacle_t *obstacles, int numObstacles, idAASCallback &callback ) const = 0;
+
+ virtual int AdjustPositionAndGetArea(idVec3& origin) = 0;
+ virtual void ShowArea(const idVec3& origin) const = 0;
+ virtual idAASFile* GetAASFile(void) = 0;
+ virtual const idBounds& DefaultSearchBounds(void) const = 0;
};
#endif /* !__AAS_H__ */
diff --git a/neo/doom3/game/ai/AASCallback_AvoidLocation.cpp b/neo/doom3/game/ai/AASCallback_AvoidLocation.cpp
new file mode 100644
index 00000000..84c99411
--- /dev/null
+++ b/neo/doom3/game/ai/AASCallback_AvoidLocation.cpp
@@ -0,0 +1,126 @@
+// Copyright (C) 2007 Id Software, Inc.
+//
+
+#pragma hdrstop
+#include "precompiled.h"
+
+#include "AAS_local.h"
+#include "../Game_local.h" // for print and error
+#include "AASCallback_AvoidLocation.h"
+
+/*
+============
+idAASCallback_AvoidLocation::idAASCallback_AvoidLocation
+============
+*/
+idAASCallback_AvoidLocation::idAASCallback_AvoidLocation()
+{
+ avoidLocation.Zero();
+ avoidDist = 0.0f;
+ obstacles = NULL;
+ numObstacles = 0;
+}
+
+/*
+============
+idAASCallback_AvoidLocation::~idAASCallback_AvoidLocation
+============
+*/
+idAASCallback_AvoidLocation::~idAASCallback_AvoidLocation()
+{
+}
+
+/*
+============
+idAASCallback_AvoidLocation::SetAvoidLocation
+============
+*/
+void idAASCallback_AvoidLocation::SetAvoidLocation( const idVec3& start, const idVec3& avoidLocation )
+{
+ this->avoidLocation = avoidLocation;
+ this->avoidDist = ( avoidLocation - start ).Length();
+}
+
+/*
+============
+idAASCallback_AvoidLocation::SetObstacles
+============
+*/
+void idAASCallback_AvoidLocation::SetObstacles( const idAAS* aas, const idAASObstacle* obstacles, int numObstacles )
+{
+ this->obstacles = obstacles;
+ this->numObstacles = numObstacles;
+
+ for( int i = 0; i < numObstacles; i++ )
+ {
+ obstacles[i].expAbsBounds[0] = obstacles[i].absBounds[0] - aas->GetSettings()->boundingBoxes[0][1];
+ obstacles[i].expAbsBounds[1] = obstacles[i].absBounds[1] - aas->GetSettings()->boundingBoxes[0][0];
+ }
+}
+
+/*
+============
+idAASCallback_AvoidLocation::PathValid
+============
+*/
+bool idAASCallback_AvoidLocation::PathValid( const idAAS* aas, const idVec3& start, const idVec3& end )
+{
+ // path may not go through any obstacles
+ for( int i = 0; i < numObstacles; i++ )
+ {
+ // if the movement vector intersects the expanded obstacle bounds
+ if( obstacles[i].expAbsBounds.LineIntersection( start, end ) )
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+/*
+============
+idAASCallback_AvoidLocation::AdditionalTravelTimeForPath
+============
+*/
+int idAASCallback_AvoidLocation::AdditionalTravelTimeForPath( const idAAS* aas, const idVec3& start, const idVec3& end )
+{
+ if( avoidDist <= 0.0f )
+ {
+ return 0;
+ }
+
+ // project avoidLocation origin onto movement vector
+ idVec3 v1 = end - start;
+ v1.Normalize();
+ idVec3 v2 = avoidLocation - start;
+ idVec3 p = start + ( v2 * v1 ) * v1;
+
+ // get the point on the path closest to the avoidLocation
+ int i;
+ for( i = 0; i < 3; i++ )
+ {
+ if( ( p[i] > start[i] + 0.1f && p[i] > end[i] + 0.1f ) ||
+ ( p[i] < start[i] - 0.1f && p[i] < end[i] - 0.1f ) )
+ {
+ break;
+ }
+ }
+
+ float dist;
+ if( i >= 3 )
+ {
+ dist = ( avoidLocation - p ).Length();
+ }
+ else
+ {
+ dist = ( avoidLocation - end ).Length();
+ }
+
+ // avoid moving closer to the avoidLocation
+ if( dist < avoidDist )
+ {
+ return idMath::Ftoi( ( avoidDist - dist ) * 10.0f );
+ }
+
+ return 0;
+}
diff --git a/neo/doom3/game/ai/AASCallback_AvoidLocation.h b/neo/doom3/game/ai/AASCallback_AvoidLocation.h
new file mode 100644
index 00000000..4431ee83
--- /dev/null
+++ b/neo/doom3/game/ai/AASCallback_AvoidLocation.h
@@ -0,0 +1,41 @@
+// Copyright (C) 2007 Id Software, Inc.
+//
+
+#ifndef __AASCALLBACK_AVOIDLOCATION_H__
+#define __AASCALLBACK_AVOIDLOCATION_H__
+
+/*
+===============================================================================
+
+ idAASCallback_AvoidLocation
+
+===============================================================================
+*/
+
+struct idAASObstacle
+{
+ idBounds absBounds; // absolute bounds of obstacle
+ mutable idBounds expAbsBounds; // expanded absolute bounds of obstacle
+};
+
+class idAASCallback_AvoidLocation : public idAASCallback
+{
+public:
+ idAASCallback_AvoidLocation();
+ ~idAASCallback_AvoidLocation();
+
+ void SetAvoidLocation( const idVec3& start, const idVec3& avoidLocation );
+ void SetObstacles( const idAAS* aas, const idAASObstacle* obstacles, int numObstacles );
+
+ virtual bool PathValid( const idAAS* aas, const idVec3& start, const idVec3& end );
+ virtual int AdditionalTravelTimeForPath( const idAAS* aas, const idVec3& start, const idVec3& end );
+ virtual bool AreaIsGoal( const idAAS* aas, int areaNum ) = 0;
+
+private:
+ idVec3 avoidLocation;
+ float avoidDist;
+ const idAASObstacle* obstacles;
+ int numObstacles;
+};
+
+#endif /* !__AASCALLBACK_AVOIDLOCATION_H__ */
diff --git a/neo/doom3/game/ai/AASCallback_FindAreaOutOfRange.cpp b/neo/doom3/game/ai/AASCallback_FindAreaOutOfRange.cpp
new file mode 100644
index 00000000..559aea42
--- /dev/null
+++ b/neo/doom3/game/ai/AASCallback_FindAreaOutOfRange.cpp
@@ -0,0 +1,49 @@
+// Copyright (C) 2007 Id Software, Inc.
+//
+
+#pragma hdrstop
+#include "precompiled.h"
+
+#include "AAS_local.h"
+#include "../Game_local.h" // for print and error
+
+#include "AASCallback_FindAreaOutOfRange.h"
+
+/*
+============
+idAASCallback_FindAreaOutOfRange::idAASCallback_FindAreaOutOfRange
+============
+*/
+idAASCallback_FindAreaOutOfRange::idAASCallback_FindAreaOutOfRange( const idVec3& targetPos, float maxDist )
+{
+ this->targetPos = targetPos;
+ this->maxDistSqr = maxDist * maxDist;
+}
+
+/*
+============
+idAASCallback_FindAreaOutOfRange::AreaIsGoal
+============
+*/
+bool idAASCallback_FindAreaOutOfRange::AreaIsGoal( const idAAS* aas, int areaNum )
+{
+ const idVec3& areaCenter = aas->AreaCenter( areaNum );
+
+ if( maxDistSqr > 0.0f )
+ {
+ float dist = ( targetPos.ToVec2() - areaCenter.ToVec2() ).LengthSqr();
+ if( dist < maxDistSqr )
+ {
+ return false;
+ }
+ }
+
+ trace_t trace;
+ gameLocal.clip.TracePoint( trace, targetPos, areaCenter + idVec3( 0.0f, 0.0f, 1.0f ), MASK_OPAQUE, NULL );
+ if( trace.fraction < 1.0f )
+ {
+ return false;
+ }
+
+ return true;
+}
diff --git a/neo/doom3/game/ai/AASCallback_FindAreaOutOfRange.h b/neo/doom3/game/ai/AASCallback_FindAreaOutOfRange.h
new file mode 100644
index 00000000..307c5e6a
--- /dev/null
+++ b/neo/doom3/game/ai/AASCallback_FindAreaOutOfRange.h
@@ -0,0 +1,29 @@
+// Copyright (C) 2007 Id Software, Inc.
+//
+
+#ifndef __AASCALLBACK_FINDAREAOUTOFRANGE_H__
+#define __AASCALLBACK_FINDAREAOUTOFRANGE_H__
+
+#include "AASCallback_AvoidLocation.h"
+
+/*
+===============================================================================
+
+ idAASCallback_FindAreaOutOfRange
+
+===============================================================================
+*/
+
+class idAASCallback_FindAreaOutOfRange : public idAASCallback_AvoidLocation
+{
+public:
+ idAASCallback_FindAreaOutOfRange( const idVec3& targetPos, float maxDist );
+
+ virtual bool AreaIsGoal( const idAAS* aas, int areaNum );
+
+private:
+ idVec3 targetPos;
+ float maxDistSqr;
+};
+
+#endif /* !__AASCALLBACK_FINDAREAOUTOFRANGE_H__ */
diff --git a/neo/doom3/game/ai/AASCallback_FindAttackPosition.cpp b/neo/doom3/game/ai/AASCallback_FindAttackPosition.cpp
new file mode 100644
index 00000000..00859ed2
--- /dev/null
+++ b/neo/doom3/game/ai/AASCallback_FindAttackPosition.cpp
@@ -0,0 +1,76 @@
+#pragma hdrstop
+#include "precompiled.h"
+
+#include "AAS_local.h"
+#include "../Game_local.h"
+#include "AASCallback_FindAttackPosition.h"
+
+/*
+============
+idAASFindAttackPosition::idAASFindAttackPosition
+============
+*/
+idAASFindAttackPosition::idAASFindAttackPosition(const idAI* self, const idMat3& gravityAxis, idEntity* target, const idVec3& targetPos, const idVec3& fireOffset) {
+ int numPVSAreas;
+
+ this->target = target;
+ this->targetPos = targetPos;
+ this->fireOffset = fireOffset;
+ this->self = self;
+ this->gravityAxis = gravityAxis;
+
+ excludeBounds = idBounds(idVec3(-64.0, -64.0f, -8.0f), idVec3(64.0, 64.0f, 64.0f));
+ excludeBounds.TranslateSelf(self->GetPhysics()->GetOrigin());
+
+ // setup PVS
+ idBounds bounds(targetPos - idVec3(16, 16, 0), targetPos + idVec3(16, 16, 64));
+ numPVSAreas = gameLocal.pvs.GetPVSAreas(bounds, PVSAreas, idEntity::MAX_PVS_AREAS);
+ targetPVS = gameLocal.pvs.SetupCurrentPVS(PVSAreas, numPVSAreas);
+}
+
+/*
+============
+idAASFindAttackPosition::~idAASFindAttackPosition
+============
+*/
+idAASFindAttackPosition::~idAASFindAttackPosition() {
+ gameLocal.pvs.FreeCurrentPVS(targetPVS);
+}
+
+/*
+============
+idAASFindAttackPosition::TestArea
+============
+*/
+bool idAASFindAttackPosition::AreaIsGoal(const idAAS* aas, int areaNum) {
+ idVec3 dir;
+ idVec3 local_dir;
+ idVec3 fromPos;
+ idMat3 axis;
+ idVec3 areaCenter;
+ int numPVSAreas;
+ int PVSAreas[idEntity::MAX_PVS_AREAS];
+
+ areaCenter = aas->AreaCenter(areaNum);
+ areaCenter[2] += 1.0f;
+
+ if (excludeBounds.ContainsPoint(areaCenter)) {
+ // too close to where we already are
+ return false;
+ }
+
+ numPVSAreas = gameLocal.pvs.GetPVSAreas(idBounds(areaCenter).Expand(16.0f), PVSAreas, idEntity::MAX_PVS_AREAS);
+ if (!gameLocal.pvs.InCurrentPVS(targetPVS, PVSAreas, numPVSAreas)) {
+ return false;
+ }
+
+ // calculate the world transform of the launch position
+ dir = targetPos - areaCenter;
+ gravityAxis.ProjectVector(dir, local_dir);
+ local_dir.z = 0.0f;
+ local_dir.ToVec2().Normalize();
+ axis = local_dir.ToMat3();
+ fromPos = areaCenter + fireOffset * axis;
+
+ return self->GetAimDir(fromPos, target, self, dir);
+}
\ No newline at end of file
diff --git a/neo/doom3/game/ai/AASCallback_FindAttackPosition.h b/neo/doom3/game/ai/AASCallback_FindAttackPosition.h
new file mode 100644
index 00000000..1884104a
--- /dev/null
+++ b/neo/doom3/game/ai/AASCallback_FindAttackPosition.h
@@ -0,0 +1,19 @@
+#pragma once
+
+class idAASFindAttackPosition : public idAASCallback {
+public:
+ idAASFindAttackPosition(const idAI* self, const idMat3& gravityAxis, idEntity* target, const idVec3& targetPos, const idVec3& fireOffset);
+ ~idAASFindAttackPosition();
+
+ virtual bool AreaIsGoal(const idAAS* aas, int areaNum);
+
+private:
+ const idAI* self;
+ idEntity* target;
+ idBounds excludeBounds;
+ idVec3 targetPos;
+ idVec3 fireOffset;
+ idMat3 gravityAxis;
+ pvsHandle_t targetPVS;
+ int PVSAreas[idEntity::MAX_PVS_AREAS];
+};
diff --git a/neo/doom3/game/ai/AASCallback_FindCoverArea.cpp b/neo/doom3/game/ai/AASCallback_FindCoverArea.cpp
new file mode 100644
index 00000000..b6392901
--- /dev/null
+++ b/neo/doom3/game/ai/AASCallback_FindCoverArea.cpp
@@ -0,0 +1,58 @@
+// Copyright (C) 2007 Id Software, Inc.
+//
+
+#pragma hdrstop
+#include "precompiled.h"
+
+#include "AAS_local.h"
+#include "../Game_local.h" // for print and error
+
+#include "AASCallback_FindCoverArea.h"
+
+/*
+============
+idAASCallback_FindCoverArea::idAASCallback_FindCoverArea
+============
+*/
+idAASCallback_FindCoverArea::idAASCallback_FindCoverArea( const idVec3& hideFromPos )
+{
+ int numPVSAreas;
+ idBounds bounds( hideFromPos - idVec3( 16, 16, 0 ), hideFromPos + idVec3( 16, 16, 64 ) );
+
+ // setup PVS
+ numPVSAreas = gameLocal.pvs.GetPVSAreas( bounds, PVSAreas, MAX_PVS_AREAS );
+ hidePVS = gameLocal.pvs.SetupCurrentPVS( PVSAreas, numPVSAreas );
+}
+
+/*
+============
+idAASCallback_FindCoverArea::~idAASCallback_FindCoverArea
+============
+*/
+idAASCallback_FindCoverArea::~idAASCallback_FindCoverArea()
+{
+ gameLocal.pvs.FreeCurrentPVS( hidePVS );
+}
+
+/*
+============
+idAASCallback_FindCoverArea::AreaIsGoal
+============
+*/
+bool idAASCallback_FindCoverArea::AreaIsGoal( const idAAS* aas, int areaNum )
+{
+ idVec3 areaCenter;
+ int numPVSAreas;
+ int PVSAreas[ MAX_PVS_AREAS ];
+
+ areaCenter = aas->AreaCenter( areaNum );
+ areaCenter[ 2 ] += 1.0f;
+
+ numPVSAreas = gameLocal.pvs.GetPVSAreas( idBounds( areaCenter ).Expand( 16.0f ), PVSAreas, MAX_PVS_AREAS );
+ if( !gameLocal.pvs.InCurrentPVS( hidePVS, PVSAreas, numPVSAreas ) )
+ {
+ return true;
+ }
+
+ return false;
+}
diff --git a/neo/doom3/game/ai/AASCallback_FindCoverArea.h b/neo/doom3/game/ai/AASCallback_FindCoverArea.h
new file mode 100644
index 00000000..d48cf692
--- /dev/null
+++ b/neo/doom3/game/ai/AASCallback_FindCoverArea.h
@@ -0,0 +1,32 @@
+// Copyright (C) 2007 Id Software, Inc.
+//
+
+#ifndef __AASCALLBACK_FINDCOVERAREA_H__
+#define __AASCALLBACK_FINDCOVERAREA_H__
+
+#include "AASCallback_AvoidLocation.h"
+
+/*
+===============================================================================
+
+ idAASCallback_FindCoverArea
+
+===============================================================================
+*/
+
+class idAASCallback_FindCoverArea : public idAASCallback_AvoidLocation
+{
+public:
+ idAASCallback_FindCoverArea( const idVec3& hideFromPos );
+ ~idAASCallback_FindCoverArea();
+
+ virtual bool AreaIsGoal( const idAAS* aas, int areaNum );
+
+private:
+ static const int MAX_PVS_AREAS = 4;
+
+ pvsHandle_t hidePVS;
+ int PVSAreas[ MAX_PVS_AREAS ];
+};
+
+#endif /* !__AASCALLBACK_FINDCOVERAREA_H__ */
diff --git a/neo/doom3/game/ai/AAS_debug.cpp b/neo/doom3/game/ai/AAS_debug.cpp
index dd4437dc..ecc3362f 100644
--- a/neo/doom3/game/ai/AAS_debug.cpp
+++ b/neo/doom3/game/ai/AAS_debug.cpp
@@ -31,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms
#include "AAS_local.h"
#include "../Game_local.h" // for cvars and debug drawing
-
+#include "AASCallback_FindCoverArea.h"
/*
============
@@ -372,7 +372,7 @@ void idAASLocal::ShowHideArea( const idVec3 &origin, int targetAreaNum ) const {
DrawCone( target, idVec3(0,0,1), 16.0f, colorYellow );
- idAASFindCover findCover( target );
+ idAASCallback_FindCoverArea findCover( target );
if ( FindNearestGoal( goal, areaNum, origin, target, TFL_WALK|TFL_AIR, obstacles, numObstacles, findCover ) ) {
DrawArea( goal.areaNum );
ShowWalkPath( origin, goal.areaNum, goal.origin );
diff --git a/neo/doom3/game/ai/AAS_local.h b/neo/doom3/game/ai/AAS_local.h
index 67f68c44..66c4187f 100644
--- a/neo/doom3/game/ai/AAS_local.h
+++ b/neo/doom3/game/ai/AAS_local.h
@@ -118,7 +118,10 @@ public:
virtual void ShowWalkPath( const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin ) const;
virtual void ShowFlyPath( const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin ) const;
virtual bool FindNearestGoal( aasGoal_t &goal, int areaNum, const idVec3 origin, const idVec3 &target, int travelFlags, aasObstacle_t *obstacles, int numObstacles, idAASCallback &callback ) const;
-
+ virtual int AdjustPositionAndGetArea(idVec3& origin);
+ virtual void ShowArea(const idVec3& origin) const;
+ virtual idAASFile* GetAASFile(void) { return file; }
+ virtual const idBounds& DefaultSearchBounds(void) const;
private:
idAASFile * file;
idStr name;
@@ -172,13 +175,11 @@ private: // pathing
idVec3 SubSampleFlyPath( int areaNum, const idVec3 &origin, const idVec3 &start, const idVec3 &end, int travelFlags, int &endAreaNum ) const;
private: // debug
- const idBounds & DefaultSearchBounds( void ) const;
void DrawCone( const idVec3 &origin, const idVec3 &dir, float radius, const idVec4 &color ) const;
void DrawArea( int areaNum ) const;
void DrawFace( int faceNum, bool side ) const;
void DrawEdge( int edgeNum, bool arrow ) const;
void DrawReachability( const idReachability *reach ) const;
- void ShowArea( const idVec3 &origin ) const;
void ShowWallEdges( const idVec3 &origin ) const;
void ShowHideArea( const idVec3 &origin, int targerAreaNum ) const;
bool PullPlayer( const idVec3 &origin, int toAreaNum ) const;
diff --git a/neo/doom3/game/ai/AAS_routing.cpp b/neo/doom3/game/ai/AAS_routing.cpp
index f3e38936..48183738 100644
--- a/neo/doom3/game/ai/AAS_routing.cpp
+++ b/neo/doom3/game/ai/AAS_routing.cpp
@@ -1182,7 +1182,7 @@ bool idAASLocal::FindNearestGoal( aasGoal_t &goal, int areaNum, const idVec3 ori
}
// if the first area is valid goal, just return the origin
- if ( callback.TestArea( this, areaNum ) ) {
+ if ( callback.AreaIsGoal( this, areaNum ) ) {
goal.areaNum = areaNum;
goal.origin = origin;
return true;
@@ -1330,7 +1330,7 @@ bool idAASLocal::FindNearestGoal( aasGoal_t &goal, int areaNum, const idVec3 ori
if ( !bestTravelTime || t < bestTravelTime ) {
// if the area is not visible to the target
- if ( callback.TestArea( this, reach->toAreaNum ) ) {
+ if ( callback.AreaIsGoal( this, reach->toAreaNum ) ) {
bestTravelTime = t;
bestAreaNum = reach->toAreaNum;
}
diff --git a/neo/doom3/game/ai/AI.cpp b/neo/doom3/game/ai/AI.cpp
index 24f63589..a4f115d5 100644
--- a/neo/doom3/game/ai/AI.cpp
+++ b/neo/doom3/game/ai/AI.cpp
@@ -30,6 +30,10 @@ If you have questions concerning this license or the applicable additional terms
#pragma hdrstop
#include "../Game_local.h"
+#include "AASCallback_AvoidLocation.h"
+#include "AASCallback_FindAreaOutOfRange.h"
+#include "AASCallback_FindAttackPosition.h"
+#include "AASCallback_FindCoverArea.h"
static const char* moveCommandString[NUM_MOVE_COMMANDS] = {
"MOVE_NONE",
@@ -128,154 +132,6 @@ void idMoveState::Restore(idRestoreGame* savefile) {
savefile->ReadInt(anim);
}
-/*
-============
-idAASFindCover::idAASFindCover
-============
-*/
-idAASFindCover::idAASFindCover(const idVec3& hideFromPos) {
- int numPVSAreas;
- idBounds bounds(hideFromPos - idVec3(16, 16, 0), hideFromPos + idVec3(16, 16, 64));
-
- // setup PVS
- numPVSAreas = gameLocal.pvs.GetPVSAreas(bounds, PVSAreas, idEntity::MAX_PVS_AREAS);
- hidePVS = gameLocal.pvs.SetupCurrentPVS(PVSAreas, numPVSAreas);
-}
-
-/*
-============
-idAASFindCover::~idAASFindCover
-============
-*/
-idAASFindCover::~idAASFindCover() {
- gameLocal.pvs.FreeCurrentPVS(hidePVS);
-}
-
-/*
-============
-idAASFindCover::TestArea
-============
-*/
-bool idAASFindCover::TestArea(const idAAS* aas, int areaNum) {
- idVec3 areaCenter;
- int numPVSAreas;
- int PVSAreas[idEntity::MAX_PVS_AREAS];
-
- areaCenter = aas->AreaCenter(areaNum);
- areaCenter[2] += 1.0f;
-
- numPVSAreas = gameLocal.pvs.GetPVSAreas(idBounds(areaCenter).Expand(16.0f), PVSAreas, idEntity::MAX_PVS_AREAS);
- if (!gameLocal.pvs.InCurrentPVS(hidePVS, PVSAreas, numPVSAreas)) {
- return true;
- }
-
- return false;
-}
-
-/*
-============
-idAASFindAreaOutOfRange::idAASFindAreaOutOfRange
-============
-*/
-idAASFindAreaOutOfRange::idAASFindAreaOutOfRange(const idVec3& targetPos, float maxDist) {
- this->targetPos = targetPos;
- this->maxDistSqr = maxDist * maxDist;
-}
-
-/*
-============
-idAASFindAreaOutOfRange::TestArea
-============
-*/
-bool idAASFindAreaOutOfRange::TestArea(const idAAS* aas, int areaNum) {
- const idVec3& areaCenter = aas->AreaCenter(areaNum);
- trace_t trace;
- float dist;
-
- dist = (targetPos.ToVec2() - areaCenter.ToVec2()).LengthSqr();
-
- if ((maxDistSqr > 0.0f) && (dist < maxDistSqr)) {
- return false;
- }
-
- gameLocal.clip.TracePoint(trace, targetPos, areaCenter + idVec3(0.0f, 0.0f, 1.0f), MASK_OPAQUE, NULL);
- if (trace.fraction < 1.0f) {
- return false;
- }
-
- return true;
-}
-
-/*
-============
-idAASFindAttackPosition::idAASFindAttackPosition
-============
-*/
-idAASFindAttackPosition::idAASFindAttackPosition(const idAI* self, const idMat3& gravityAxis, idEntity* target, const idVec3& targetPos, const idVec3& fireOffset) {
- int numPVSAreas;
-
- this->target = target;
- this->targetPos = targetPos;
- this->fireOffset = fireOffset;
- this->self = self;
- this->gravityAxis = gravityAxis;
-
- excludeBounds = idBounds(idVec3(-64.0, -64.0f, -8.0f), idVec3(64.0, 64.0f, 64.0f));
- excludeBounds.TranslateSelf(self->GetPhysics()->GetOrigin());
-
- // setup PVS
- idBounds bounds(targetPos - idVec3(16, 16, 0), targetPos + idVec3(16, 16, 64));
- numPVSAreas = gameLocal.pvs.GetPVSAreas(bounds, PVSAreas, idEntity::MAX_PVS_AREAS);
- targetPVS = gameLocal.pvs.SetupCurrentPVS(PVSAreas, numPVSAreas);
-}
-
-/*
-============
-idAASFindAttackPosition::~idAASFindAttackPosition
-============
-*/
-idAASFindAttackPosition::~idAASFindAttackPosition() {
- gameLocal.pvs.FreeCurrentPVS(targetPVS);
-}
-
-/*
-============
-idAASFindAttackPosition::TestArea
-============
-*/
-bool idAASFindAttackPosition::TestArea(const idAAS* aas, int areaNum) {
- idVec3 dir;
- idVec3 local_dir;
- idVec3 fromPos;
- idMat3 axis;
- idVec3 areaCenter;
- int numPVSAreas;
- int PVSAreas[idEntity::MAX_PVS_AREAS];
-
- areaCenter = aas->AreaCenter(areaNum);
- areaCenter[2] += 1.0f;
-
- if (excludeBounds.ContainsPoint(areaCenter)) {
- // too close to where we already are
- return false;
- }
-
- numPVSAreas = gameLocal.pvs.GetPVSAreas(idBounds(areaCenter).Expand(16.0f), PVSAreas, idEntity::MAX_PVS_AREAS);
- if (!gameLocal.pvs.InCurrentPVS(targetPVS, PVSAreas, numPVSAreas)) {
- return false;
- }
-
- // calculate the world transform of the launch position
- dir = targetPos - areaCenter;
- gravityAxis.ProjectVector(dir, local_dir);
- local_dir.z = 0.0f;
- local_dir.ToVec2().Normalize();
- axis = local_dir.ToMat3();
- fromPos = areaCenter + fireOffset * axis;
-
- return self->GetAimDir(fromPos, target, self, dir);
-}
-
/*
=====================
idAI::idAI
@@ -1839,7 +1695,7 @@ bool idAI::MoveOutOfRange(idEntity* ent, float range) {
pos = ent->GetPhysics()->GetOrigin();
}
- idAASFindAreaOutOfRange findGoal(pos, range);
+ idAASCallback_FindAreaOutOfRange findGoal(pos, range);
if (!aas->FindNearestGoal(goal, areaNum, org, pos, travelFlags, &obstacle, 1, findGoal)) {
StopMove(MOVE_STATUS_DEST_UNREACHABLE);
AI_DEST_UNREACHABLE = true;
@@ -1990,7 +1846,7 @@ bool idAI::MoveToCover(idEntity* entity, const idVec3& hideFromPos) {
// consider the entity the monster tries to hide from as an obstacle
obstacle.absBounds = entity->GetPhysics()->GetAbsBounds();
- idAASFindCover findCover(hideFromPos);
+ idAASCallback_FindCoverArea findCover(hideFromPos);
if (!aas->FindNearestGoal(hideGoal, areaNum, org, hideFromPos, travelFlags, &obstacle, 1, findCover)) {
StopMove(MOVE_STATUS_DEST_UNREACHABLE);
AI_DEST_UNREACHABLE = true;
diff --git a/neo/doom3/game/ai/AI.h b/neo/doom3/game/ai/AI.h
index 0b84096e..22ec7dc0 100644
--- a/neo/doom3/game/ai/AI.h
+++ b/neo/doom3/game/ai/AI.h
@@ -195,46 +195,7 @@ public:
int anim;
};
-class idAASFindCover : public idAASCallback {
-public:
- idAASFindCover(const idVec3& hideFromPos);
- ~idAASFindCover();
- virtual bool TestArea(const idAAS* aas, int areaNum);
-
-private:
- pvsHandle_t hidePVS;
- int PVSAreas[idEntity::MAX_PVS_AREAS];
-};
-
-class idAASFindAreaOutOfRange : public idAASCallback {
-public:
- idAASFindAreaOutOfRange(const idVec3& targetPos, float maxDist);
-
- virtual bool TestArea(const idAAS* aas, int areaNum);
-
-private:
- idVec3 targetPos;
- float maxDistSqr;
-};
-
-class idAASFindAttackPosition : public idAASCallback {
-public:
- idAASFindAttackPosition(const idAI* self, const idMat3& gravityAxis, idEntity* target, const idVec3& targetPos, const idVec3& fireOffset);
- ~idAASFindAttackPosition();
-
- virtual bool TestArea(const idAAS* aas, int areaNum);
-
-private:
- const idAI* self;
- idEntity* target;
- idBounds excludeBounds;
- idVec3 targetPos;
- idVec3 fireOffset;
- idMat3 gravityAxis;
- pvsHandle_t targetPVS;
- int PVSAreas[idEntity::MAX_PVS_AREAS];
-};
class idAI : public idActor {
public:
diff --git a/neo/doom3/game/bots/Bot.cpp b/neo/doom3/game/bots/Bot.cpp
index f19cfe83..fc12ba13 100644
--- a/neo/doom3/game/bots/Bot.cpp
+++ b/neo/doom3/game/bots/Bot.cpp
@@ -23,7 +23,7 @@ rvmBot::rvmBot()
{
//bs.action = NULL;
hasSpawned = false;
- gameLocal.RegisterBot( this );
+ //gameLocal.RegisterBot( this );
}
/*
@@ -33,7 +33,7 @@ rvmBot::~rvmBot
*/
rvmBot::~rvmBot()
{
- gameLocal.UnRegisterBot( this );
+ //gameLocal.UnRegisterBot( this );
}
/*
@@ -71,12 +71,12 @@ void rvmBot::BotUpdateInventory( void )
bs.inventory[INVENTORY_PLASMAGUN] = HasWeapon( weapon_plasmagun );
bs.inventory[INVENTORY_BFG10K] = 0;
bs.inventory[INVENTORY_GRAPPLINGHOOK] = 0;
- bs.inventory[INVENTORY_SHELLS] = inventory.ammo[idWeapon::GetAmmoNumForName( "ammo_shells" )].Get();
- bs.inventory[INVENTORY_BULLETS] = inventory.ammo[idWeapon::GetAmmoNumForName( "ammo_clip" )].Get();
+ bs.inventory[INVENTORY_SHELLS] = inventory.ammo[idWeapon::GetAmmoNumForName( "ammo_shells" )];
+ bs.inventory[INVENTORY_BULLETS] = inventory.ammo[idWeapon::GetAmmoNumForName( "ammo_clip" )];
bs.inventory[INVENTORY_GRENADES] = 0;
- bs.inventory[INVENTORY_CELLS] = inventory.ammo[idWeapon::GetAmmoNumForName( "ammo_cells" )].Get();
+ bs.inventory[INVENTORY_CELLS] = inventory.ammo[idWeapon::GetAmmoNumForName( "ammo_cells" )];
bs.inventory[INVENTORY_LIGHTNINGAMMO] = 0;
- bs.inventory[INVENTORY_ROCKETS] = inventory.ammo[idWeapon::GetAmmoNumForName( "ammo_rockets" )].Get();
+ bs.inventory[INVENTORY_ROCKETS] = inventory.ammo[idWeapon::GetAmmoNumForName( "ammo_rockets" )];
bs.inventory[INVENTORY_SLUGS] = 0;
bs.inventory[INVENTORY_BFGAMMO] = 0;
bs.inventory[INVENTORY_HEALTH] = health;
@@ -108,7 +108,7 @@ void rvmBot::Spawn( void )
idPlayer::Spawn();
- if( common->IsServer() )
+ if( gameLocal.isServer )
{
weapon_machinegun = SlotForWeapon( "weapon_machinegun" );
weapon_shotgun = SlotForWeapon( "weapon_shotgun" );
@@ -120,7 +120,7 @@ void rvmBot::Spawn( void )
WP_PLASMAGUN = weapon_plasmagun;
WP_ROCKET_LAUNCHER = weapon_rocketlauncher;
- botName = spawnArgs.GetString( "botname" );
+ botName = "dark";// spawnArgs.GetString("botname");
aas = gameLocal.GetBotAAS();
if( aas == NULL )
@@ -209,7 +209,7 @@ void rvmBot::SpawnToPoint( const idVec3& spawn_origin, const idAngles& spawn_ang
{
idPlayer::SpawnToPoint( spawn_origin, spawn_angles );
- if( common->IsServer() )
+ if( gameLocal.isServer )
{
bs.ltg_time = 0;
stateThread.SetState("state_SeekLTG");
@@ -388,7 +388,7 @@ void rvmBot::Think( void )
return;
}
- if( common->IsServer() )
+ if( gameLocal.isServer )
{
ServerThink();
@@ -400,10 +400,10 @@ void rvmBot::Think( void )
color = idVec4(1, 0, 0, 1);
idBounds bounds = idBounds( idVec3( -10, -10, -10 ), idVec3( 10, 10, 10 ) );
- common->RW()->DebugBounds( color, bounds, GetOrigin() );
+ gameRenderWorld->DebugBounds( color, bounds, GetOrigin() );
idMat3 axis = viewAngles.ToMat3();
- common->RW()->DrawTextA(stateThread.GetState()->state.c_str(), GetOrigin(), 1.0f, color, axis);
+ gameRenderWorld->DrawTextA(stateThread.GetState()->state.c_str(), GetOrigin(), 1.0f, color, axis);
}
}
diff --git a/neo/doom3/game/bots/Bot.h b/neo/doom3/game/bots/Bot.h
index 5a85c64d..474acab3 100644
--- a/neo/doom3/game/bots/Bot.h
+++ b/neo/doom3/game/bots/Bot.h
@@ -848,9 +848,14 @@ public:
virtual void InflictedDamageEvent(idEntity* target) override;
virtual void StateThreadChanged(void) override;
+ virtual bool IsBot(void) override
+ {
+ return true;
+ }
+
void SetEnemy( idPlayer* player, idVec3 origin );
- void BotInputFrame( idUserCmdMgr& cmdMgr );
+ void BotInputFrame( void );
void Bot_ResetUcmd( usercmd_t& ucmd );
static void PresenceTypeBoundingBox( int presencetype, idVec3& mins, idVec3& maxs );
diff --git a/neo/doom3/game/bots/BotAI.cpp b/neo/doom3/game/bots/BotAI.cpp
index c39396d5..539686dc 100644
--- a/neo/doom3/game/bots/BotAI.cpp
+++ b/neo/doom3/game/bots/BotAI.cpp
@@ -1135,19 +1135,46 @@ int rvmBot::BotNearbyGoal( bot_state_t* bs, int tfl, bot_goal_t* ltg, float rang
rvmBot::BotGetRandomPointNearPosition
=======================
*/
-void rvmBot::BotGetRandomPointNearPosition( idVec3 point, idVec3& randomPoint, float radius )
-{
- idAAS* aas = gameLocal.GetBotAAS();
- idAASFile* file = aas->GetAASFile();
+void rvmBot::BotGetRandomPointNearPosition(const idVec3 point, idVec3& randomPoint, float radius) {
+ randomPoint = point;
- int areaNum = aas->PointAreaNum(point);
- const aasArea_t& area = file->GetArea(areaNum);
- int firstEdge = area.firstEdge;
- int i = rvRandom::irand(0, area.numEdges);
+ idAAS* aas = this->aas;
+ if (!aas) {
+ return;
+ }
- const aasEdge_t &edge = file->GetEdge(abs(file->GetEdgeIndex(firstEdge + i)));
+ const int areaNum = aas->PointAreaNum(point);
+ if (areaNum <= 0) {
+ return;
+ }
- randomPoint = file->GetVertex(edge.vertexNum[0]);
+ if (radius <= 0.0f) {
+ randomPoint = aas->AreaCenter(areaNum);
+ aas->PushPointIntoAreaNum(areaNum, randomPoint);
+ return;
+ }
+
+ for (int i = 0; i < 16; i++) {
+ const float angle = gameLocal.random.RandomFloat() * idMath::TWO_PI;
+ const float dist = gameLocal.random.RandomFloat() * radius;
+
+ idVec3 testPoint = point;
+ testPoint.x += idMath::Cos(angle) * dist;
+ testPoint.y += idMath::Sin(angle) * dist;
+
+ const int testAreaNum = aas->PointAreaNum(testPoint);
+ if (testAreaNum <= 0) {
+ continue;
+ }
+
+ aas->PushPointIntoAreaNum(testAreaNum, testPoint);
+
+ randomPoint = testPoint;
+ return;
+ }
+
+ randomPoint = aas->AreaCenter(areaNum);
+ aas->PushPointIntoAreaNum(areaNum, randomPoint);
}
/*
diff --git a/neo/doom3/game/bots/BotAI_Battle_Chase.cpp b/neo/doom3/game/bots/BotAI_Battle_Chase.cpp
index a612b7f8..f59d22f9 100644
--- a/neo/doom3/game/bots/BotAI_Battle_Chase.cpp
+++ b/neo/doom3/game/bots/BotAI_Battle_Chase.cpp
@@ -83,8 +83,8 @@ stateResult_t rvmBot::state_Chase(stateParms_t* parms)
// goal.areanum = bs.lastenemyareanum;
VectorCopy( bs.lastenemyorigin, goal.origin );
- goal.mins = idMath::CreateVector( -8, -8, -8 );
- goal.maxs = idMath::CreateVector( 8, 8, 8 );
+ goal.mins = idVec3( -8, -8, -8 );
+ goal.maxs = idVec3( 8, 8, 8 );
// jmarshall - goal origin is last visible position
{
diff --git a/neo/doom3/game/bots/Bot_Input.cpp b/neo/doom3/game/bots/Bot_Input.cpp
index 58e3a9ab..f65896e5 100644
--- a/neo/doom3/game/bots/Bot_Input.cpp
+++ b/neo/doom3/game/bots/Bot_Input.cpp
@@ -5,6 +5,7 @@
#pragma hdrstop
#include "../Game_local.h"
+#include "../../../engine/framework/UsercmdGen.h"
/*
==============
@@ -110,8 +111,8 @@ void rvmBot::BotInputToUserCommand(bot_input_t* bi, usercmd_t* ucmd, int time)
}
//jump/moveup
- if (bi->actionflags & ACTION_JUMP)
- ucmd->buttons |= BUTTON_JUMP;
+ //if (bi->actionflags & ACTION_JUMP)
+ // ucmd->buttons |= BUTTON_JUMP;
// ucmd->upmove += 127;
//
@@ -149,12 +150,12 @@ void rvmBot::Bot_ResetUcmd( usercmd_t& ucmd )
rvmBot::BotInputFrame
========================
*/
-void rvmBot::BotInputFrame( idUserCmdMgr& cmdMgr )
+void rvmBot::BotInputFrame( void )
{
usercmd_t botcmd = { }; //(usercmd_t&)cmdMgr.GetUserCmdForPlayer(entityNumber); // gameLocal.usercmds[entityNumber];
Bot_ResetUcmd( botcmd );
BotInputToUserCommand( &bs.botinput, &botcmd, gameLocal.time );
- cmdMgr.PutUserCmdForPlayer( entityNumber, botcmd );
+ networkSystem->ServerSetBotUserCommand(entityNumber, gameLocal.framenum, botcmd);
}
\ No newline at end of file
diff --git a/neo/doom3/game/gamesys/GameTypeInfo.cpp b/neo/doom3/game/gamesys/GameTypeInfo.cpp
index 8c2b30d2..d4a770d5 100644
--- a/neo/doom3/game/gamesys/GameTypeInfo.cpp
+++ b/neo/doom3/game/gamesys/GameTypeInfo.cpp
@@ -4312,6 +4312,9 @@ intptr_t idItem::Invoke(const char *functionName, void *param1) {
Present();
return 0;
};
+ if(functionNameHash == 161386) { // GetModelIndex
+ return (intptr_t)GetModelIndex();
+ };
if(functionNameHash == 278761) { // ClientPredictionThink
ClientPredictionThink();
return 0;
@@ -4343,6 +4346,9 @@ bool idItem::HasNativeFunction(const char *functionName) {
if(functionNameHash == 90014) { // Present
return true;
};
+ if(functionNameHash == 161386) { // GetModelIndex
+ return true;
+ };
if(functionNameHash == 278761) { // ClientPredictionThink
return true;
};
@@ -4784,6 +4790,17 @@ intptr_t idPlayer::Invoke(const char *functionName, void *param1) {
if(functionNameHash == 127139) { // SelfSmooth
return (intptr_t)SelfSmooth();
};
+ if(functionNameHash == 58283) { // IsBot
+ IsBot();
+ return 0;
+ };
+ if(functionNameHash == 127519) { // IsShooting
+ return (intptr_t)IsShooting();
+ };
+ if(functionNameHash == 162753) { // GetViewHeight
+ GetViewHeight();
+ return 0;
+ };
if(functionNameHash == 127156) { // StopFiring
StopFiring();
return 0;
@@ -5157,6 +5174,15 @@ bool idPlayer::HasNativeFunction(const char *functionName) {
if(functionNameHash == 127139) { // SelfSmooth
return true;
};
+ if(functionNameHash == 58283) { // IsBot
+ return true;
+ };
+ if(functionNameHash == 127519) { // IsShooting
+ return true;
+ };
+ if(functionNameHash == 162753) { // GetViewHeight
+ return true;
+ };
if(functionNameHash == 127156) { // StopFiring
return true;
};
@@ -9287,3 +9313,120 @@ bool rvmWeaponGrabber::HasNativeFunction(const char *functionName) {
};
+intptr_t rvmBot::Invoke(const char *functionName, void *param1) {
+ int functionNameHash = idStr::Hash(functionName);
+ if(functionNameHash == 63102) { // Spawn
+ Spawn();
+ return 0;
+ };
+ if(functionNameHash == 61762) { // Think
+ Think();
+ return 0;
+ };
+ if(functionNameHash == 228837) { // StateThreadChanged
+ StateThreadChanged();
+ return 0;
+ };
+ if(functionNameHash == 58283) { // IsBot
+ IsBot();
+ return 0;
+ };
+ if(functionNameHash == 164171) { // BotInputFrame
+ BotInputFrame();
+ return 0;
+ };
+ if(functionNameHash == 141568) { // ServerThink
+ ServerThink();
+ return 0;
+ };
+ if(functionNameHash == 240097) { // BotUpdateInventory
+ BotUpdateInventory();
+ return 0;
+ };
+ if(functionNameHash == 207135) { // MoveToCoverPoint
+ MoveToCoverPoint();
+ return 0;
+ };
+ if(functionNameHash == 139244) { // state_Chase
+ state_Chase((stateParms_t *)param1);
+ return 0;
+ };
+ if(functionNameHash == 221136) { // state_BattleFight
+ return (intptr_t)state_BattleFight((stateParms_t *)param1);
+ };
+ if(functionNameHash == 183184) { // state_BattleNBG
+ return (intptr_t)state_BattleNBG((stateParms_t *)param1);
+ };
+ if(functionNameHash == 170832) { // state_Retreat
+ return (intptr_t)state_Retreat((stateParms_t *)param1);
+ };
+ if(functionNameHash == 172007) { // state_Respawn
+ return (intptr_t)state_Respawn((stateParms_t *)param1);
+ };
+ if(functionNameHash == 155264) { // state_SeekNBG
+ return (intptr_t)state_SeekNBG((stateParms_t *)param1);
+ };
+ if(functionNameHash == 157346) { // state_SeekLTG
+ return (intptr_t)state_SeekLTG((stateParms_t *)param1);
+ };
+ if(functionNameHash == 180698) { // state_Attacked
+ return (intptr_t)state_Attacked((stateParms_t *)param1);
+ };
+ return __super::Invoke(functionName, param1);
+
+};
+
+bool rvmBot::HasNativeFunction(const char *functionName) {
+ int functionNameHash = idStr::Hash(functionName);
+ if(functionNameHash == 63102) { // Spawn
+ return true;
+ };
+ if(functionNameHash == 61762) { // Think
+ return true;
+ };
+ if(functionNameHash == 228837) { // StateThreadChanged
+ return true;
+ };
+ if(functionNameHash == 58283) { // IsBot
+ return true;
+ };
+ if(functionNameHash == 164171) { // BotInputFrame
+ return true;
+ };
+ if(functionNameHash == 141568) { // ServerThink
+ return true;
+ };
+ if(functionNameHash == 240097) { // BotUpdateInventory
+ return true;
+ };
+ if(functionNameHash == 207135) { // MoveToCoverPoint
+ return true;
+ };
+ if(functionNameHash == 139244) { // state_Chase
+ return true;
+ };
+ if(functionNameHash == 221136) { // state_BattleFight
+ return true;
+ };
+ if(functionNameHash == 183184) { // state_BattleNBG
+ return true;
+ };
+ if(functionNameHash == 170832) { // state_Retreat
+ return true;
+ };
+ if(functionNameHash == 172007) { // state_Respawn
+ return true;
+ };
+ if(functionNameHash == 155264) { // state_SeekNBG
+ return true;
+ };
+ if(functionNameHash == 157346) { // state_SeekLTG
+ return true;
+ };
+ if(functionNameHash == 180698) { // state_Attacked
+ return true;
+ };
+ return __super::HasNativeFunction(functionName);
+
+};
+
diff --git a/neo/doom3/game/gamesys/GameTypeInfo.h b/neo/doom3/game/gamesys/GameTypeInfo.h
index b4a6dab9..8530c68a 100644
--- a/neo/doom3/game/gamesys/GameTypeInfo.h
+++ b/neo/doom3/game/gamesys/GameTypeInfo.h
@@ -7,9 +7,9 @@
This file has been generated with the Type Info Generator v1.1 (c) 2004 id Software
- 1172 constants
- 130 enums
- 556 classes/structs/unions
+ 1182 constants
+ 132 enums
+ 578 classes/structs/unions
38 templates
7 max inheritance level for 'idAI_Vagary'
@@ -103,7 +103,8 @@ static constantInfo_t constantInfo[] = {
{ "int", "NA_BAD", "0" },
{ "int", "NA_LOOPBACK", "1" },
{ "int", "NA_BROADCAST", "2" },
- { "int", "NA_IP", "3" },
+ { "int", "NA_BOT", "3" },
+ { "int", "NA_IP", "4" },
{ "int", "THREAD_NORMAL", "0" },
{ "int", "THREAD_ABOVE_NORMAL", "1" },
{ "int", "THREAD_HIGHEST", "2" },
@@ -1219,6 +1220,15 @@ static constantInfo_t constantInfo[] = {
{ "int", "OP_BREAK", "121" },
{ "int", "OP_CONTINUE", "122" },
{ "int", "NUM_OPCODES", "123" },
+ { "int", "NULLMOVEFLAG", "-1" },
+ { "int", "MOVE_PRONE", "0" },
+ { "int", "MOVE_CROUCH", "1" },
+ { "int", "MOVE_WALK", "2" },
+ { "int", "MOVE_RUN2", "3" },
+ { "int", "MOVE_SPRINT", "4" },
+ { "int", "MOVE_JUMP", "5" },
+ { "int", "KILL", "0" },
+ { "int", "DEATH", "1" },
{ NULL, NULL, NULL }
};
@@ -1311,7 +1321,8 @@ static enumValueInfo_t netadrtype_t_typeInfo[] = {
{ "NA_BAD", 0 },
{ "NA_LOOPBACK", 1 },
{ "NA_BROADCAST", 2 },
- { "NA_IP", 3 },
+ { "NA_BOT", 3 },
+ { "NA_IP", 4 },
{ NULL, 0 }
};
@@ -2703,6 +2714,23 @@ static enumValueInfo_t enum_129_typeInfo[] = {
{ NULL, 0 }
};
+static enumValueInfo_t botMoveFlags_t_typeInfo[] = {
+ { "NULLMOVEFLAG", -1 },
+ { "MOVE_PRONE", 0 },
+ { "MOVE_CROUCH", 1 },
+ { "MOVE_WALK", 2 },
+ { "MOVE_RUN2", 3 },
+ { "MOVE_SPRINT", 4 },
+ { "MOVE_JUMP", 5 },
+ { NULL, 0 }
+};
+
+static enumValueInfo_t botChat_t_typeInfo[] = {
+ { "KILL", 0 },
+ { "DEATH", 1 },
+ { NULL, 0 }
+};
+
static enumTypeInfo_t enumTypeInfo[] = {
// { "BITT< unsigned int B >::bitValue_t", BITT_unsigned_int_B__bitValue_t_typeInfo },
{ "cpuid_t", cpuid_t_typeInfo },
@@ -2834,6 +2862,8 @@ static enumTypeInfo_t enumTypeInfo[] = {
{ "moveStatus_t", moveStatus_t_typeInfo },
{ "stopEvent_t", stopEvent_t_typeInfo },
{ "enum_129", enum_129_typeInfo },
+ { "botMoveFlags_t", botMoveFlags_t_typeInfo },
+ { "botChat_t", botChat_t_typeInfo },
{ NULL, NULL }
};
@@ -3306,6 +3336,10 @@ static classVariableInfo_t idLexer_typeInfo[] = {
{ NULL, 0 }
};
+static classVariableInfo_t rvmScopedLexerBaseFolder_typeInfo[] = {
+ { NULL, 0 }
+};
+
static classVariableInfo_t define_t_typeInfo[] = {
{ "char *", "name", (intptr_t)(&((define_t *)0)->name), sizeof( ((define_t *)0)->name ) },
{ "int", "flags", (intptr_t)(&((define_t *)0)->flags), sizeof( ((define_t *)0)->flags ) },
@@ -3988,9 +4022,9 @@ static classVariableInfo_t glRaytracingVec3_t_typeInfo[] = {
{ NULL, 0 }
};
-static classVariableInfo_t glRaytracingLight_s_class_172_typeInfo[] = {
-// { "float", "pad1", (intptr_t)(&((glRaytracingLight_s::class_172 *)0)->pad1), sizeof( ((glRaytracingLight_s::class_172 *)0)->pad1 ) },
-// { "float", "volumetricScattering", (intptr_t)(&((glRaytracingLight_s::class_172 *)0)->volumetricScattering), sizeof( ((glRaytracingLight_s::class_172 *)0)->volumetricScattering ) },
+static classVariableInfo_t glRaytracingLight_s_class_173_typeInfo[] = {
+// { "float", "pad1", (intptr_t)(&((glRaytracingLight_s::class_173 *)0)->pad1), sizeof( ((glRaytracingLight_s::class_173 *)0)->pad1 ) },
+// { "float", "volumetricScattering", (intptr_t)(&((glRaytracingLight_s::class_173 *)0)->volumetricScattering), sizeof( ((glRaytracingLight_s::class_173 *)0)->volumetricScattering ) },
{ NULL, 0 }
};
@@ -5107,11 +5141,11 @@ static classVariableInfo_t frameLookup_t_typeInfo[] = {
{ NULL, 0 }
};
-static classVariableInfo_t class_281_class_281_typeInfo[] = {
-// { "const idSoundShader *", "soundShader", (intptr_t)(&((class_281::class_281 *)0)->soundShader), sizeof( ((class_281::class_281 *)0)->soundShader ) },
-// { "const function_t *", "function", (intptr_t)(&((class_281::class_281 *)0)->function), sizeof( ((class_281::class_281 *)0)->function ) },
-// { "const idDeclSkin *", "skin", (intptr_t)(&((class_281::class_281 *)0)->skin), sizeof( ((class_281::class_281 *)0)->skin ) },
-// { "int", "index", (intptr_t)(&((class_281::class_281 *)0)->index), sizeof( ((class_281::class_281 *)0)->index ) },
+static classVariableInfo_t class_282_class_282_typeInfo[] = {
+// { "const idSoundShader *", "soundShader", (intptr_t)(&((class_282::class_282 *)0)->soundShader), sizeof( ((class_282::class_282 *)0)->soundShader ) },
+// { "const function_t *", "function", (intptr_t)(&((class_282::class_282 *)0)->function), sizeof( ((class_282::class_282 *)0)->function ) },
+// { "const idDeclSkin *", "skin", (intptr_t)(&((class_282::class_282 *)0)->skin), sizeof( ((class_282::class_282 *)0)->skin ) },
+// { "int", "index", (intptr_t)(&((class_282::class_282 *)0)->index), sizeof( ((class_282::class_282 *)0)->index ) },
{ NULL, 0 }
};
@@ -5279,7 +5313,8 @@ static classVariableInfo_t idClipModel_typeInfo[] = {
};
static classVariableInfo_t idClip_typeInfo[] = {
- { ": int", "numClipSectors", (intptr_t)(&((idClip *)0)->numClipSectors), sizeof( ((idClip *)0)->numClipSectors ) },
+ { ": cmHandle_t", "worldCollisionModel", (intptr_t)(&((idClip *)0)->worldCollisionModel), sizeof( ((idClip *)0)->worldCollisionModel ) },
+ { "int", "numClipSectors", (intptr_t)(&((idClip *)0)->numClipSectors), sizeof( ((idClip *)0)->numClipSectors ) },
{ "clipSector_s *", "clipSectors", (intptr_t)(&((idClip *)0)->clipSectors), sizeof( ((idClip *)0)->clipSectors ) },
{ "idBounds", "worldBounds", (intptr_t)(&((idClip *)0)->worldBounds), sizeof( ((idClip *)0)->worldBounds ) },
{ "idClipModel", "temporaryClipModel", (intptr_t)(&((idClip *)0)->temporaryClipModel), sizeof( ((idClip *)0)->temporaryClipModel ) },
@@ -5541,6 +5576,8 @@ static classVariableInfo_t idGameLocal_typeInfo[] = {
{ "idStrList", "shakeSounds", (intptr_t)(&((idGameLocal *)0)->shakeSounds), sizeof( ((idGameLocal *)0)->shakeSounds ) },
{ "byte[16384]", "lagometer", (intptr_t)(&((idGameLocal *)0)->lagometer), sizeof( ((idGameLocal *)0)->lagometer ) },
{ "idList < rvmGameDelayRemoveEntry_t >", "delayRemoveEntities", (intptr_t)(&((idGameLocal *)0)->delayRemoveEntities), sizeof( ((idGameLocal *)0)->delayRemoveEntities ) },
+ { "const idDeclEntityDef *", "botItemTable", (intptr_t)(&((idGameLocal *)0)->botItemTable), sizeof( ((idGameLocal *)0)->botItemTable ) },
+ { "idAAS *", "bot_aas", (intptr_t)(&((idGameLocal *)0)->bot_aas), sizeof( ((idGameLocal *)0)->bot_aas ) },
{ NULL, 0 }
};
@@ -6672,6 +6709,7 @@ static classVariableInfo_t idActor_typeInfo[] = {
{ "idAnimState", "headAnim", (intptr_t)(&((idActor *)0)->headAnim), sizeof( ((idActor *)0)->headAnim ) },
{ "idAnimState", "torsoAnim", (intptr_t)(&((idActor *)0)->torsoAnim), sizeof( ((idActor *)0)->torsoAnim ) },
{ "idAnimState", "legsAnim", (intptr_t)(&((idActor *)0)->legsAnim), sizeof( ((idActor *)0)->legsAnim ) },
+ { "rvStateThread", "stateThread", (intptr_t)(&((idActor *)0)->stateThread), sizeof( ((idActor *)0)->stateThread ) },
{ "bool", "allowPain", (intptr_t)(&((idActor *)0)->allowPain), sizeof( ((idActor *)0)->allowPain ) },
{ "bool", "allowEyeFocus", (intptr_t)(&((idActor *)0)->allowEyeFocus), sizeof( ((idActor *)0)->allowEyeFocus ) },
{ "bool", "finalBoss", (intptr_t)(&((idActor *)0)->finalBoss), sizeof( ((idActor *)0)->finalBoss ) },
@@ -6928,6 +6966,7 @@ static classVariableInfo_t idItem_typeInfo[] = {
{ "bool", "spin", (intptr_t)(&((idItem *)0)->spin), sizeof( ((idItem *)0)->spin ) },
{ "bool", "pulse", (intptr_t)(&((idItem *)0)->pulse), sizeof( ((idItem *)0)->pulse ) },
{ "bool", "canPickUp", (intptr_t)(&((idItem *)0)->canPickUp), sizeof( ((idItem *)0)->canPickUp ) },
+ { "int", "modelindex", (intptr_t)(&((idItem *)0)->modelindex), sizeof( ((idItem *)0)->modelindex ) },
{ "int", "itemShellHandle", (intptr_t)(&((idItem *)0)->itemShellHandle), sizeof( ((idItem *)0)->itemShellHandle ) },
{ "const idMaterial *", "shellMaterial", (intptr_t)(&((idItem *)0)->shellMaterial), sizeof( ((idItem *)0)->shellMaterial ) },
{ "mutable bool", "inView", (intptr_t)(&((idItem *)0)->inView), sizeof( ((idItem *)0)->inView ) },
@@ -7183,6 +7222,7 @@ static classVariableInfo_t idPlayer_typeInfo[] = {
{ "idVec3", "firstPersonViewOrigin", (intptr_t)(&((idPlayer *)0)->firstPersonViewOrigin), sizeof( ((idPlayer *)0)->firstPersonViewOrigin ) },
{ "idMat3", "firstPersonViewAxis", (intptr_t)(&((idPlayer *)0)->firstPersonViewAxis), sizeof( ((idPlayer *)0)->firstPersonViewAxis ) },
{ "idDragEntity", "dragEntity", (intptr_t)(&((idPlayer *)0)->dragEntity), sizeof( ((idPlayer *)0)->dragEntity ) },
+ { "idStr", "netname", (intptr_t)(&((idPlayer *)0)->netname), sizeof( ((idPlayer *)0)->netname ) },
{ ": jointHandle_t", "hipJoint", (intptr_t)(&((idPlayer *)0)->hipJoint), sizeof( ((idPlayer *)0)->hipJoint ) },
{ "jointHandle_t", "chestJoint", (intptr_t)(&((idPlayer *)0)->chestJoint), sizeof( ((idPlayer *)0)->chestJoint ) },
{ "jointHandle_t", "headJoint", (intptr_t)(&((idPlayer *)0)->headJoint), sizeof( ((idPlayer *)0)->headJoint ) },
@@ -7835,30 +7875,6 @@ static classVariableInfo_t idMoveState_typeInfo[] = {
{ NULL, 0 }
};
-static classVariableInfo_t idAASFindCover_typeInfo[] = {
- { ": pvsHandle_t", "hidePVS", (intptr_t)(&((idAASFindCover *)0)->hidePVS), sizeof( ((idAASFindCover *)0)->hidePVS ) },
- { "int[4]", "PVSAreas", (intptr_t)(&((idAASFindCover *)0)->PVSAreas), sizeof( ((idAASFindCover *)0)->PVSAreas ) },
- { NULL, 0 }
-};
-
-static classVariableInfo_t idAASFindAreaOutOfRange_typeInfo[] = {
- { ": idVec3", "targetPos", (intptr_t)(&((idAASFindAreaOutOfRange *)0)->targetPos), sizeof( ((idAASFindAreaOutOfRange *)0)->targetPos ) },
- { "float", "maxDistSqr", (intptr_t)(&((idAASFindAreaOutOfRange *)0)->maxDistSqr), sizeof( ((idAASFindAreaOutOfRange *)0)->maxDistSqr ) },
- { NULL, 0 }
-};
-
-static classVariableInfo_t idAASFindAttackPosition_typeInfo[] = {
- { ": const idAI *", "self", (intptr_t)(&((idAASFindAttackPosition *)0)->self), sizeof( ((idAASFindAttackPosition *)0)->self ) },
- { "idEntity *", "target", (intptr_t)(&((idAASFindAttackPosition *)0)->target), sizeof( ((idAASFindAttackPosition *)0)->target ) },
- { "idBounds", "excludeBounds", (intptr_t)(&((idAASFindAttackPosition *)0)->excludeBounds), sizeof( ((idAASFindAttackPosition *)0)->excludeBounds ) },
- { "idVec3", "targetPos", (intptr_t)(&((idAASFindAttackPosition *)0)->targetPos), sizeof( ((idAASFindAttackPosition *)0)->targetPos ) },
- { "idVec3", "fireOffset", (intptr_t)(&((idAASFindAttackPosition *)0)->fireOffset), sizeof( ((idAASFindAttackPosition *)0)->fireOffset ) },
- { "idMat3", "gravityAxis", (intptr_t)(&((idAASFindAttackPosition *)0)->gravityAxis), sizeof( ((idAASFindAttackPosition *)0)->gravityAxis ) },
- { "pvsHandle_t", "targetPVS", (intptr_t)(&((idAASFindAttackPosition *)0)->targetPVS), sizeof( ((idAASFindAttackPosition *)0)->targetPVS ) },
- { "int[4]", "PVSAreas", (intptr_t)(&((idAASFindAttackPosition *)0)->PVSAreas), sizeof( ((idAASFindAttackPosition *)0)->PVSAreas ) },
- { NULL, 0 }
-};
-
static classVariableInfo_t idAI_typeInfo[] = {
{ ": idAAS *", "aas", (intptr_t)(&((idAI *)0)->aas), sizeof( ((idAI *)0)->aas ) },
{ "int", "travelFlags", (intptr_t)(&((idAI *)0)->travelFlags), sizeof( ((idAI *)0)->travelFlags ) },
@@ -8200,6 +8216,291 @@ static classVariableInfo_t rvmWeaponGrabber_typeInfo[] = {
{ NULL, 0 }
};
+static classVariableInfo_t fuzzyseperator_t_typeInfo[] = {
+ { "bool", "inUse", (intptr_t)(&((fuzzyseperator_t *)0)->inUse), sizeof( ((fuzzyseperator_t *)0)->inUse ) },
+ { "int", "index", (intptr_t)(&((fuzzyseperator_t *)0)->index), sizeof( ((fuzzyseperator_t *)0)->index ) },
+ { "int", "value", (intptr_t)(&((fuzzyseperator_t *)0)->value), sizeof( ((fuzzyseperator_t *)0)->value ) },
+ { "int", "type", (intptr_t)(&((fuzzyseperator_t *)0)->type), sizeof( ((fuzzyseperator_t *)0)->type ) },
+ { "float", "weight", (intptr_t)(&((fuzzyseperator_t *)0)->weight), sizeof( ((fuzzyseperator_t *)0)->weight ) },
+ { "float", "minweight", (intptr_t)(&((fuzzyseperator_t *)0)->minweight), sizeof( ((fuzzyseperator_t *)0)->minweight ) },
+ { "float", "maxweight", (intptr_t)(&((fuzzyseperator_t *)0)->maxweight), sizeof( ((fuzzyseperator_t *)0)->maxweight ) },
+ { "fuzzyseperator_t *", "child", (intptr_t)(&((fuzzyseperator_t *)0)->child), sizeof( ((fuzzyseperator_t *)0)->child ) },
+ { "fuzzyseperator_t *", "next", (intptr_t)(&((fuzzyseperator_t *)0)->next), sizeof( ((fuzzyseperator_t *)0)->next ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t weight_t_typeInfo[] = {
+ { "idStr", "name", (intptr_t)(&((weight_t *)0)->name), sizeof( ((weight_t *)0)->name ) },
+ { "fuzzyseperator_t *", "firstseperator", (intptr_t)(&((weight_t *)0)->firstseperator), sizeof( ((weight_t *)0)->firstseperator ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t weightconfig_t_typeInfo[] = {
+ { "bool", "inUse", (intptr_t)(&((weightconfig_t *)0)->inUse), sizeof( ((weightconfig_t *)0)->inUse ) },
+ { "int", "numweights", (intptr_t)(&((weightconfig_t *)0)->numweights), sizeof( ((weightconfig_t *)0)->numweights ) },
+ { "weight_t[128]", "weights", (intptr_t)(&((weightconfig_t *)0)->weights), sizeof( ((weightconfig_t *)0)->weights ) },
+ { "idStr", "filename", (intptr_t)(&((weightconfig_t *)0)->filename), sizeof( ((weightconfig_t *)0)->filename ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t cvalue_typeInfo[] = {
+ { "int", "integer", (intptr_t)(&((cvalue *)0)->integer), sizeof( ((cvalue *)0)->integer ) },
+ { "float", "_float", (intptr_t)(&((cvalue *)0)->_float), sizeof( ((cvalue *)0)->_float ) },
+ { "idStr", "string", (intptr_t)(&((cvalue *)0)->string), sizeof( ((cvalue *)0)->string ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t bot_characteristic_t_typeInfo[] = {
+ { "char", "type", (intptr_t)(&((bot_characteristic_t *)0)->type), sizeof( ((bot_characteristic_t *)0)->type ) },
+ { "cvalue", "value", (intptr_t)(&((bot_characteristic_t *)0)->value), sizeof( ((bot_characteristic_t *)0)->value ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t bot_character_t_typeInfo[] = {
+ { "idStr", "filename", (intptr_t)(&((bot_character_t *)0)->filename), sizeof( ((bot_character_t *)0)->filename ) },
+ { "bool", "inUse", (intptr_t)(&((bot_character_t *)0)->inUse), sizeof( ((bot_character_t *)0)->inUse ) },
+ { "float", "skill", (intptr_t)(&((bot_character_t *)0)->skill), sizeof( ((bot_character_t *)0)->skill ) },
+ { "bot_characteristic_t[80]", "c", (intptr_t)(&((bot_character_t *)0)->c), sizeof( ((bot_character_t *)0)->c ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t bot_input_t_typeInfo[] = {
+ { "float", "thinktime", (intptr_t)(&((bot_input_t *)0)->thinktime), sizeof( ((bot_input_t *)0)->thinktime ) },
+ { "idVec3", "dir", (intptr_t)(&((bot_input_t *)0)->dir), sizeof( ((bot_input_t *)0)->dir ) },
+ { "float", "speed", (intptr_t)(&((bot_input_t *)0)->speed), sizeof( ((bot_input_t *)0)->speed ) },
+ { "idAngles", "viewangles", (intptr_t)(&((bot_input_t *)0)->viewangles), sizeof( ((bot_input_t *)0)->viewangles ) },
+ { "int", "actionflags", (intptr_t)(&((bot_input_t *)0)->actionflags), sizeof( ((bot_input_t *)0)->actionflags ) },
+ { "int", "weapon", (intptr_t)(&((bot_input_t *)0)->weapon), sizeof( ((bot_input_t *)0)->weapon ) },
+ { "int", "lastWeaponNum", (intptr_t)(&((bot_input_t *)0)->lastWeaponNum), sizeof( ((bot_input_t *)0)->lastWeaponNum ) },
+ { "bool", "respawn", (intptr_t)(&((bot_input_t *)0)->respawn), sizeof( ((bot_input_t *)0)->respawn ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t rvmBotUtil_typeInfo[] = {
+ { NULL, 0 }
+};
+
+static classVariableInfo_t idBotCharacterStatsManager_typeInfo[] = {
+ { "bot_character_t *", "default_char_profile", (intptr_t)(&((idBotCharacterStatsManager *)0)->default_char_profile), sizeof( ((idBotCharacterStatsManager *)0)->default_char_profile ) },
+ { "bot_character_t[256]", "charStatsList", (intptr_t)(&((idBotCharacterStatsManager *)0)->charStatsList), sizeof( ((idBotCharacterStatsManager *)0)->charStatsList ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t idBotFuzzyWeightManager_typeInfo[] = {
+ { "weightconfig_t[128]", "weightFileList", (intptr_t)(&((idBotFuzzyWeightManager *)0)->weightFileList), sizeof( ((idBotFuzzyWeightManager *)0)->weightFileList ) },
+ { "fuzzyseperator_t[8192]", "fuzzyseperators", (intptr_t)(&((idBotFuzzyWeightManager *)0)->fuzzyseperators), sizeof( ((idBotFuzzyWeightManager *)0)->fuzzyseperators ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t projectileinfo_t_typeInfo[] = {
+ { "idStr", "name", (intptr_t)(&((projectileinfo_t *)0)->name), sizeof( ((projectileinfo_t *)0)->name ) },
+ { "idStr", "model", (intptr_t)(&((projectileinfo_t *)0)->model), sizeof( ((projectileinfo_t *)0)->model ) },
+ { "int", "flags", (intptr_t)(&((projectileinfo_t *)0)->flags), sizeof( ((projectileinfo_t *)0)->flags ) },
+ { "float", "gravity", (intptr_t)(&((projectileinfo_t *)0)->gravity), sizeof( ((projectileinfo_t *)0)->gravity ) },
+ { "int", "damage", (intptr_t)(&((projectileinfo_t *)0)->damage), sizeof( ((projectileinfo_t *)0)->damage ) },
+ { "float", "radius", (intptr_t)(&((projectileinfo_t *)0)->radius), sizeof( ((projectileinfo_t *)0)->radius ) },
+ { "int", "visdamage", (intptr_t)(&((projectileinfo_t *)0)->visdamage), sizeof( ((projectileinfo_t *)0)->visdamage ) },
+ { "int", "damagetype", (intptr_t)(&((projectileinfo_t *)0)->damagetype), sizeof( ((projectileinfo_t *)0)->damagetype ) },
+ { "int", "healthinc", (intptr_t)(&((projectileinfo_t *)0)->healthinc), sizeof( ((projectileinfo_t *)0)->healthinc ) },
+ { "float", "push", (intptr_t)(&((projectileinfo_t *)0)->push), sizeof( ((projectileinfo_t *)0)->push ) },
+ { "float", "detonation", (intptr_t)(&((projectileinfo_t *)0)->detonation), sizeof( ((projectileinfo_t *)0)->detonation ) },
+ { "float", "bounce", (intptr_t)(&((projectileinfo_t *)0)->bounce), sizeof( ((projectileinfo_t *)0)->bounce ) },
+ { "float", "bouncefric", (intptr_t)(&((projectileinfo_t *)0)->bouncefric), sizeof( ((projectileinfo_t *)0)->bouncefric ) },
+ { "float", "bouncestop", (intptr_t)(&((projectileinfo_t *)0)->bouncestop), sizeof( ((projectileinfo_t *)0)->bouncestop ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t weaponinfo_t_typeInfo[] = {
+ { "int", "valid", (intptr_t)(&((weaponinfo_t *)0)->valid), sizeof( ((weaponinfo_t *)0)->valid ) },
+ { "int", "number", (intptr_t)(&((weaponinfo_t *)0)->number), sizeof( ((weaponinfo_t *)0)->number ) },
+ { "idStr", "name", (intptr_t)(&((weaponinfo_t *)0)->name), sizeof( ((weaponinfo_t *)0)->name ) },
+ { "idStr", "model", (intptr_t)(&((weaponinfo_t *)0)->model), sizeof( ((weaponinfo_t *)0)->model ) },
+ { "int", "level", (intptr_t)(&((weaponinfo_t *)0)->level), sizeof( ((weaponinfo_t *)0)->level ) },
+ { "int", "weaponindex", (intptr_t)(&((weaponinfo_t *)0)->weaponindex), sizeof( ((weaponinfo_t *)0)->weaponindex ) },
+ { "int", "flags", (intptr_t)(&((weaponinfo_t *)0)->flags), sizeof( ((weaponinfo_t *)0)->flags ) },
+ { "idStr", "projectile", (intptr_t)(&((weaponinfo_t *)0)->projectile), sizeof( ((weaponinfo_t *)0)->projectile ) },
+ { "int", "numprojectiles", (intptr_t)(&((weaponinfo_t *)0)->numprojectiles), sizeof( ((weaponinfo_t *)0)->numprojectiles ) },
+ { "float", "hspread", (intptr_t)(&((weaponinfo_t *)0)->hspread), sizeof( ((weaponinfo_t *)0)->hspread ) },
+ { "float", "vspread", (intptr_t)(&((weaponinfo_t *)0)->vspread), sizeof( ((weaponinfo_t *)0)->vspread ) },
+ { "float", "speed", (intptr_t)(&((weaponinfo_t *)0)->speed), sizeof( ((weaponinfo_t *)0)->speed ) },
+ { "float", "acceleration", (intptr_t)(&((weaponinfo_t *)0)->acceleration), sizeof( ((weaponinfo_t *)0)->acceleration ) },
+ { "idVec3", "recoil", (intptr_t)(&((weaponinfo_t *)0)->recoil), sizeof( ((weaponinfo_t *)0)->recoil ) },
+ { "idVec3", "offset", (intptr_t)(&((weaponinfo_t *)0)->offset), sizeof( ((weaponinfo_t *)0)->offset ) },
+ { "idVec3", "angleoffset", (intptr_t)(&((weaponinfo_t *)0)->angleoffset), sizeof( ((weaponinfo_t *)0)->angleoffset ) },
+ { "float", "extrazvelocity", (intptr_t)(&((weaponinfo_t *)0)->extrazvelocity), sizeof( ((weaponinfo_t *)0)->extrazvelocity ) },
+ { "int", "ammoamount", (intptr_t)(&((weaponinfo_t *)0)->ammoamount), sizeof( ((weaponinfo_t *)0)->ammoamount ) },
+ { "int", "ammoindex", (intptr_t)(&((weaponinfo_t *)0)->ammoindex), sizeof( ((weaponinfo_t *)0)->ammoindex ) },
+ { "float", "activate", (intptr_t)(&((weaponinfo_t *)0)->activate), sizeof( ((weaponinfo_t *)0)->activate ) },
+ { "float", "reload", (intptr_t)(&((weaponinfo_t *)0)->reload), sizeof( ((weaponinfo_t *)0)->reload ) },
+ { "float", "spinup", (intptr_t)(&((weaponinfo_t *)0)->spinup), sizeof( ((weaponinfo_t *)0)->spinup ) },
+ { "float", "spindown", (intptr_t)(&((weaponinfo_t *)0)->spindown), sizeof( ((weaponinfo_t *)0)->spindown ) },
+ { "projectileinfo_t", "proj", (intptr_t)(&((weaponinfo_t *)0)->proj), sizeof( ((weaponinfo_t *)0)->proj ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t bot_weaponstate_t_typeInfo[] = {
+ { "bool", "inUse", (intptr_t)(&((bot_weaponstate_t *)0)->inUse), sizeof( ((bot_weaponstate_t *)0)->inUse ) },
+ { "weightconfig_t *", "weaponweightconfig", (intptr_t)(&((bot_weaponstate_t *)0)->weaponweightconfig), sizeof( ((bot_weaponstate_t *)0)->weaponweightconfig ) },
+ { "int[32]", "weaponweightindex", (intptr_t)(&((bot_weaponstate_t *)0)->weaponweightindex), sizeof( ((bot_weaponstate_t *)0)->weaponweightindex ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t idBotWeaponInfoManager_typeInfo[] = {
+ { ": idList < projectileinfo_t >", "projectileinfo", (intptr_t)(&((idBotWeaponInfoManager *)0)->projectileinfo), sizeof( ((idBotWeaponInfoManager *)0)->projectileinfo ) },
+ { "bot_weaponstate_t[33]", "botweaponstates", (intptr_t)(&((idBotWeaponInfoManager *)0)->botweaponstates), sizeof( ((idBotWeaponInfoManager *)0)->botweaponstates ) },
+ { "weaponinfo_t[32]", "weaponinfo", (intptr_t)(&((idBotWeaponInfoManager *)0)->weaponinfo), sizeof( ((idBotWeaponInfoManager *)0)->weaponinfo ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t bot_goal_t_typeInfo[] = {
+ { "int", "framenum", (intptr_t)(&((bot_goal_t *)0)->framenum), sizeof( ((bot_goal_t *)0)->framenum ) },
+ { "idVec3", "origin", (intptr_t)(&((bot_goal_t *)0)->origin), sizeof( ((bot_goal_t *)0)->origin ) },
+ { "int", "areanum", (intptr_t)(&((bot_goal_t *)0)->areanum), sizeof( ((bot_goal_t *)0)->areanum ) },
+ { "idVec3", "mins", (intptr_t)(&((bot_goal_t *)0)->mins), sizeof( ((bot_goal_t *)0)->mins ) },
+ { "idVec3", "maxs", (intptr_t)(&((bot_goal_t *)0)->maxs), sizeof( ((bot_goal_t *)0)->maxs ) },
+ { "int", "entitynum", (intptr_t)(&((bot_goal_t *)0)->entitynum), sizeof( ((bot_goal_t *)0)->entitynum ) },
+ { "int", "number", (intptr_t)(&((bot_goal_t *)0)->number), sizeof( ((bot_goal_t *)0)->number ) },
+ { "int", "flags", (intptr_t)(&((bot_goal_t *)0)->flags), sizeof( ((bot_goal_t *)0)->flags ) },
+ { "int", "iteminfo", (intptr_t)(&((bot_goal_t *)0)->iteminfo), sizeof( ((bot_goal_t *)0)->iteminfo ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t maplocation_t_typeInfo[] = {
+ { "idVec3", "origin", (intptr_t)(&((maplocation_t *)0)->origin), sizeof( ((maplocation_t *)0)->origin ) },
+ { "int", "areanum", (intptr_t)(&((maplocation_t *)0)->areanum), sizeof( ((maplocation_t *)0)->areanum ) },
+ { "idStr", "name", (intptr_t)(&((maplocation_t *)0)->name), sizeof( ((maplocation_t *)0)->name ) },
+ { "maplocation_t *", "next", (intptr_t)(&((maplocation_t *)0)->next), sizeof( ((maplocation_t *)0)->next ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t campspot_t_typeInfo[] = {
+ { "idVec3", "origin", (intptr_t)(&((campspot_t *)0)->origin), sizeof( ((campspot_t *)0)->origin ) },
+ { "int", "areanum", (intptr_t)(&((campspot_t *)0)->areanum), sizeof( ((campspot_t *)0)->areanum ) },
+ { "idStr", "name", (intptr_t)(&((campspot_t *)0)->name), sizeof( ((campspot_t *)0)->name ) },
+ { "float", "range", (intptr_t)(&((campspot_t *)0)->range), sizeof( ((campspot_t *)0)->range ) },
+ { "float", "weight", (intptr_t)(&((campspot_t *)0)->weight), sizeof( ((campspot_t *)0)->weight ) },
+ { "float", "wait", (intptr_t)(&((campspot_t *)0)->wait), sizeof( ((campspot_t *)0)->wait ) },
+ { "float", "random", (intptr_t)(&((campspot_t *)0)->random), sizeof( ((campspot_t *)0)->random ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t levelitem_t_typeInfo[] = {
+ { "idStr", "name", (intptr_t)(&((levelitem_t *)0)->name), sizeof( ((levelitem_t *)0)->name ) },
+ { "int", "number", (intptr_t)(&((levelitem_t *)0)->number), sizeof( ((levelitem_t *)0)->number ) },
+ { "int", "iteminfo", (intptr_t)(&((levelitem_t *)0)->iteminfo), sizeof( ((levelitem_t *)0)->iteminfo ) },
+ { "int", "flags", (intptr_t)(&((levelitem_t *)0)->flags), sizeof( ((levelitem_t *)0)->flags ) },
+ { "float", "weight", (intptr_t)(&((levelitem_t *)0)->weight), sizeof( ((levelitem_t *)0)->weight ) },
+ { "idVec3", "origin", (intptr_t)(&((levelitem_t *)0)->origin), sizeof( ((levelitem_t *)0)->origin ) },
+ { "idVec3", "goalorigin", (intptr_t)(&((levelitem_t *)0)->goalorigin), sizeof( ((levelitem_t *)0)->goalorigin ) },
+ { "idItem *", "item", (intptr_t)(&((levelitem_t *)0)->item), sizeof( ((levelitem_t *)0)->item ) },
+ { "float", "timeout", (intptr_t)(&((levelitem_t *)0)->timeout), sizeof( ((levelitem_t *)0)->timeout ) },
+ { "levelitem_t *", "prev", (intptr_t)(&((levelitem_t *)0)->prev), sizeof( ((levelitem_t *)0)->prev ) },
+ { "levelitem_t *", "next", (intptr_t)(&((levelitem_t *)0)->next), sizeof( ((levelitem_t *)0)->next ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t iteminfo_t_typeInfo[] = {
+ { "idStr", "classname", (intptr_t)(&((iteminfo_t *)0)->classname), sizeof( ((iteminfo_t *)0)->classname ) },
+ { "idStr", "name", (intptr_t)(&((iteminfo_t *)0)->name), sizeof( ((iteminfo_t *)0)->name ) },
+ { "idStr", "model", (intptr_t)(&((iteminfo_t *)0)->model), sizeof( ((iteminfo_t *)0)->model ) },
+ { "int", "modelindex", (intptr_t)(&((iteminfo_t *)0)->modelindex), sizeof( ((iteminfo_t *)0)->modelindex ) },
+ { "int", "type", (intptr_t)(&((iteminfo_t *)0)->type), sizeof( ((iteminfo_t *)0)->type ) },
+ { "int", "index", (intptr_t)(&((iteminfo_t *)0)->index), sizeof( ((iteminfo_t *)0)->index ) },
+ { "float", "respawntime", (intptr_t)(&((iteminfo_t *)0)->respawntime), sizeof( ((iteminfo_t *)0)->respawntime ) },
+ { "idVec3", "mins", (intptr_t)(&((iteminfo_t *)0)->mins), sizeof( ((iteminfo_t *)0)->mins ) },
+ { "idVec3", "maxs", (intptr_t)(&((iteminfo_t *)0)->maxs), sizeof( ((iteminfo_t *)0)->maxs ) },
+ { "int", "number", (intptr_t)(&((iteminfo_t *)0)->number), sizeof( ((iteminfo_t *)0)->number ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t itemconfig_t_typeInfo[] = {
+ { "int", "numiteminfo", (intptr_t)(&((itemconfig_t *)0)->numiteminfo), sizeof( ((itemconfig_t *)0)->numiteminfo ) },
+ { "iteminfo_t[256]", "iteminfo", (intptr_t)(&((itemconfig_t *)0)->iteminfo), sizeof( ((itemconfig_t *)0)->iteminfo ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t bot_goalstate_t_typeInfo[] = {
+ { "weightconfig_t *", "itemweightconfig", (intptr_t)(&((bot_goalstate_t *)0)->itemweightconfig), sizeof( ((bot_goalstate_t *)0)->itemweightconfig ) },
+ { "int *", "itemweightindex", (intptr_t)(&((bot_goalstate_t *)0)->itemweightindex), sizeof( ((bot_goalstate_t *)0)->itemweightindex ) },
+ { "int", "client", (intptr_t)(&((bot_goalstate_t *)0)->client), sizeof( ((bot_goalstate_t *)0)->client ) },
+ { "int", "lastreachabilityarea", (intptr_t)(&((bot_goalstate_t *)0)->lastreachabilityarea), sizeof( ((bot_goalstate_t *)0)->lastreachabilityarea ) },
+ { "bot_goal_t[8]", "goalstack", (intptr_t)(&((bot_goalstate_t *)0)->goalstack), sizeof( ((bot_goalstate_t *)0)->goalstack ) },
+ { "int", "goalstacktop", (intptr_t)(&((bot_goalstate_t *)0)->goalstacktop), sizeof( ((bot_goalstate_t *)0)->goalstacktop ) },
+ { "int[256]", "avoidgoals", (intptr_t)(&((bot_goalstate_t *)0)->avoidgoals), sizeof( ((bot_goalstate_t *)0)->avoidgoals ) },
+ { "float[256]", "avoidgoaltimes", (intptr_t)(&((bot_goalstate_t *)0)->avoidgoaltimes), sizeof( ((bot_goalstate_t *)0)->avoidgoaltimes ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t idBotGoalManager_typeInfo[] = {
+ { ": bot_goalstate_t[33]", "botgoalstates", (intptr_t)(&((idBotGoalManager *)0)->botgoalstates), sizeof( ((idBotGoalManager *)0)->botgoalstates ) },
+ { "itemconfig_t", "itemconfiglocal", (intptr_t)(&((idBotGoalManager *)0)->itemconfiglocal), sizeof( ((idBotGoalManager *)0)->itemconfiglocal ) },
+ { "itemconfig_t *", "itemconfig", (intptr_t)(&((idBotGoalManager *)0)->itemconfig), sizeof( ((idBotGoalManager *)0)->itemconfig ) },
+ { "levelitem_t[256]", "levelitemheap", (intptr_t)(&((idBotGoalManager *)0)->levelitemheap), sizeof( ((idBotGoalManager *)0)->levelitemheap ) },
+ { "levelitem_t *", "freelevelitems", (intptr_t)(&((idBotGoalManager *)0)->freelevelitems), sizeof( ((idBotGoalManager *)0)->freelevelitems ) },
+ { "levelitem_t *", "levelitems", (intptr_t)(&((idBotGoalManager *)0)->levelitems), sizeof( ((idBotGoalManager *)0)->levelitems ) },
+ { "int", "numlevelitems", (intptr_t)(&((idBotGoalManager *)0)->numlevelitems), sizeof( ((idBotGoalManager *)0)->numlevelitems ) },
+ { "idList < maplocation_t >", "maplocations", (intptr_t)(&((idBotGoalManager *)0)->maplocations), sizeof( ((idBotGoalManager *)0)->maplocations ) },
+ { "idList < campspot_t >", "campspots", (intptr_t)(&((idBotGoalManager *)0)->campspots), sizeof( ((idBotGoalManager *)0)->campspots ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t bot_state_t_typeInfo[] = {
+ { "bot_character_t *", "character", (intptr_t)(&((bot_state_t *)0)->character), sizeof( ((bot_state_t *)0)->character ) },
+ { "int", "gs", (intptr_t)(&((bot_state_t *)0)->gs), sizeof( ((bot_state_t *)0)->gs ) },
+ { "int", "ws", (intptr_t)(&((bot_state_t *)0)->ws), sizeof( ((bot_state_t *)0)->ws ) },
+ { "int", "enemy", (intptr_t)(&((bot_state_t *)0)->enemy), sizeof( ((bot_state_t *)0)->enemy ) },
+ { "int", "client", (intptr_t)(&((bot_state_t *)0)->client), sizeof( ((bot_state_t *)0)->client ) },
+ { "idEntity *", "attackerEntity", (intptr_t)(&((bot_state_t *)0)->attackerEntity), sizeof( ((bot_state_t *)0)->attackerEntity ) },
+ { "int", "lasthealth", (intptr_t)(&((bot_state_t *)0)->lasthealth), sizeof( ((bot_state_t *)0)->lasthealth ) },
+ { "int", "entitynum", (intptr_t)(&((bot_state_t *)0)->entitynum), sizeof( ((bot_state_t *)0)->entitynum ) },
+ { "int", "setupcount", (intptr_t)(&((bot_state_t *)0)->setupcount), sizeof( ((bot_state_t *)0)->setupcount ) },
+ { "int", "ltg_time", (intptr_t)(&((bot_state_t *)0)->ltg_time), sizeof( ((bot_state_t *)0)->ltg_time ) },
+ { "int", "flags", (intptr_t)(&((bot_state_t *)0)->flags), sizeof( ((bot_state_t *)0)->flags ) },
+ { "int", "weaponnum", (intptr_t)(&((bot_state_t *)0)->weaponnum), sizeof( ((bot_state_t *)0)->weaponnum ) },
+ { "bool", "useRandomPosition", (intptr_t)(&((bot_state_t *)0)->useRandomPosition), sizeof( ((bot_state_t *)0)->useRandomPosition ) },
+ { "float", "thinktime", (intptr_t)(&((bot_state_t *)0)->thinktime), sizeof( ((bot_state_t *)0)->thinktime ) },
+ { "float", "chase_time", (intptr_t)(&((bot_state_t *)0)->chase_time), sizeof( ((bot_state_t *)0)->chase_time ) },
+ { "float", "attackjump_time", (intptr_t)(&((bot_state_t *)0)->attackjump_time), sizeof( ((bot_state_t *)0)->attackjump_time ) },
+ { "float", "attackcrouch_time", (intptr_t)(&((bot_state_t *)0)->attackcrouch_time), sizeof( ((bot_state_t *)0)->attackcrouch_time ) },
+ { "float", "attackstrafe_time", (intptr_t)(&((bot_state_t *)0)->attackstrafe_time), sizeof( ((bot_state_t *)0)->attackstrafe_time ) },
+ { "float", "attackchase_time", (intptr_t)(&((bot_state_t *)0)->attackchase_time), sizeof( ((bot_state_t *)0)->attackchase_time ) },
+ { "float", "firethrottlewait_time", (intptr_t)(&((bot_state_t *)0)->firethrottlewait_time), sizeof( ((bot_state_t *)0)->firethrottlewait_time ) },
+ { "float", "firethrottleshoot_time", (intptr_t)(&((bot_state_t *)0)->firethrottleshoot_time), sizeof( ((bot_state_t *)0)->firethrottleshoot_time ) },
+ { "float", "nbg_time", (intptr_t)(&((bot_state_t *)0)->nbg_time), sizeof( ((bot_state_t *)0)->nbg_time ) },
+ { "float", "entergame_time", (intptr_t)(&((bot_state_t *)0)->entergame_time), sizeof( ((bot_state_t *)0)->entergame_time ) },
+ { "float", "weaponchange_time", (intptr_t)(&((bot_state_t *)0)->weaponchange_time), sizeof( ((bot_state_t *)0)->weaponchange_time ) },
+ { "float", "check_time", (intptr_t)(&((bot_state_t *)0)->check_time), sizeof( ((bot_state_t *)0)->check_time ) },
+ { "float", "teleport_time", (intptr_t)(&((bot_state_t *)0)->teleport_time), sizeof( ((bot_state_t *)0)->teleport_time ) },
+ { "float", "enemyvisible_time", (intptr_t)(&((bot_state_t *)0)->enemyvisible_time), sizeof( ((bot_state_t *)0)->enemyvisible_time ) },
+ { "int", "enemysuicide", (intptr_t)(&((bot_state_t *)0)->enemysuicide), sizeof( ((bot_state_t *)0)->enemysuicide ) },
+ { "float", "enemysight_time", (intptr_t)(&((bot_state_t *)0)->enemysight_time), sizeof( ((bot_state_t *)0)->enemysight_time ) },
+ { "float", "enemydeath_time", (intptr_t)(&((bot_state_t *)0)->enemydeath_time), sizeof( ((bot_state_t *)0)->enemydeath_time ) },
+ { "float", "aggressiveAttackTime", (intptr_t)(&((bot_state_t *)0)->aggressiveAttackTime), sizeof( ((bot_state_t *)0)->aggressiveAttackTime ) },
+ { "idVec3", "origin", (intptr_t)(&((bot_state_t *)0)->origin), sizeof( ((bot_state_t *)0)->origin ) },
+ { "idVec3", "aimtarget", (intptr_t)(&((bot_state_t *)0)->aimtarget), sizeof( ((bot_state_t *)0)->aimtarget ) },
+ { "idVec3", "random_move_position", (intptr_t)(&((bot_state_t *)0)->random_move_position), sizeof( ((bot_state_t *)0)->random_move_position ) },
+ { "idVec3", "last_enemy_visible_position", (intptr_t)(&((bot_state_t *)0)->last_enemy_visible_position), sizeof( ((bot_state_t *)0)->last_enemy_visible_position ) },
+ { "idAngles", "viewangles", (intptr_t)(&((bot_state_t *)0)->viewangles), sizeof( ((bot_state_t *)0)->viewangles ) },
+ { "idVec3", "enemyorigin", (intptr_t)(&((bot_state_t *)0)->enemyorigin), sizeof( ((bot_state_t *)0)->enemyorigin ) },
+ { "idVec3", "eye", (intptr_t)(&((bot_state_t *)0)->eye), sizeof( ((bot_state_t *)0)->eye ) },
+ { "idVec3", "lastenemyorigin", (intptr_t)(&((bot_state_t *)0)->lastenemyorigin), sizeof( ((bot_state_t *)0)->lastenemyorigin ) },
+ { "int[256]", "inventory", (intptr_t)(&((bot_state_t *)0)->inventory), sizeof( ((bot_state_t *)0)->inventory ) },
+ { "bot_goal_t", "currentGoal", (intptr_t)(&((bot_state_t *)0)->currentGoal), sizeof( ((bot_state_t *)0)->currentGoal ) },
+ { "bot_input_t", "botinput", (intptr_t)(&((bot_state_t *)0)->botinput), sizeof( ((bot_state_t *)0)->botinput ) },
+ { NULL, 0 }
+};
+
+static classVariableInfo_t rvmBot_typeInfo[] = {
+ { ": bot_state_t", "bs", (intptr_t)(&((rvmBot *)0)->bs), sizeof( ((rvmBot *)0)->bs ) },
+ { "bool", "hasSpawned", (intptr_t)(&((rvmBot *)0)->hasSpawned), sizeof( ((rvmBot *)0)->hasSpawned ) },
+ { ": int", "weapon_machinegun", (intptr_t)(&((rvmBot *)0)->weapon_machinegun), sizeof( ((rvmBot *)0)->weapon_machinegun ) },
+ { "int", "weapon_shotgun", (intptr_t)(&((rvmBot *)0)->weapon_shotgun), sizeof( ((rvmBot *)0)->weapon_shotgun ) },
+ { "int", "weapon_plasmagun", (intptr_t)(&((rvmBot *)0)->weapon_plasmagun), sizeof( ((rvmBot *)0)->weapon_plasmagun ) },
+ { "int", "weapon_rocketlauncher", (intptr_t)(&((rvmBot *)0)->weapon_rocketlauncher), sizeof( ((rvmBot *)0)->weapon_rocketlauncher ) },
+ { ": idAAS *", "aas", (intptr_t)(&((rvmBot *)0)->aas), sizeof( ((rvmBot *)0)->aas ) },
+ { NULL, 0 }
+};
+
static classTypeInfo_t classTypeInfo[] = {
// { "BITT< unsigned int B >", "", sizeof(BITT< unsigned int B >), BITT_unsigned_int_B__typeInfo },
{ "sysEvent_t", "", sizeof(sysEvent_t), sysEvent_t_typeInfo },
@@ -8293,6 +8594,7 @@ static classTypeInfo_t classTypeInfo[] = {
{ "idToken", "idStr", sizeof(idToken), idToken_typeInfo },
{ "punctuation_t", "", sizeof(punctuation_t), punctuation_t_typeInfo },
{ "idLexer", "", sizeof(idLexer), idLexer_typeInfo },
+ { "rvmScopedLexerBaseFolder", "", sizeof(rvmScopedLexerBaseFolder), rvmScopedLexerBaseFolder_typeInfo },
{ "define_t", "", sizeof(define_t), define_t_typeInfo },
{ "indent_t", "", sizeof(indent_t), indent_t_typeInfo },
{ "idParser", "", sizeof(idParser), idParser_typeInfo },
@@ -8373,7 +8675,7 @@ static classTypeInfo_t classTypeInfo[] = {
{ "glRaytracingMeshDesc_t", "", sizeof(glRaytracingMeshDesc_t), glRaytracingMeshDesc_t_typeInfo },
{ "glRaytracingInstanceDesc_t", "", sizeof(glRaytracingInstanceDesc_t), glRaytracingInstanceDesc_t_typeInfo },
{ "glRaytracingVec3_t", "", sizeof(glRaytracingVec3_t), glRaytracingVec3_t_typeInfo },
-// { "glRaytracingLight_s::class_172", "", sizeof(glRaytracingLight_s::class_172), glRaytracingLight_s_class_172_typeInfo },
+// { "glRaytracingLight_s::class_173", "", sizeof(glRaytracingLight_s::class_173), glRaytracingLight_s_class_173_typeInfo },
{ "glRaytracingLight_t", "", sizeof(glRaytracingLight_t), glRaytracingLight_t_typeInfo },
{ "glRaytracingLightingPassDesc_t", "", sizeof(glRaytracingLightingPassDesc_t), glRaytracingLightingPassDesc_t_typeInfo },
{ "QD3D12NeuralPOMImageRGBA8", "", sizeof(QD3D12NeuralPOMImageRGBA8), QD3D12NeuralPOMImageRGBA8_typeInfo },
@@ -8482,7 +8784,7 @@ static classTypeInfo_t classTypeInfo[] = {
{ "jointAnimInfo_t", "", sizeof(jointAnimInfo_t), jointAnimInfo_t_typeInfo },
{ "jointMod_t", "", sizeof(jointMod_t), jointMod_t_typeInfo },
{ "frameLookup_t", "", sizeof(frameLookup_t), frameLookup_t_typeInfo },
-// { "class_281::class_281", "", sizeof(class_281::class_281), class_281_class_281_typeInfo },
+// { "class_282::class_282", "", sizeof(class_282::class_282), class_282_class_282_typeInfo },
{ "frameCommand_t", "", sizeof(frameCommand_t), frameCommand_t_typeInfo },
{ "animFlags_t", "", sizeof(animFlags_t), animFlags_t_typeInfo },
{ "idModelExport", "", sizeof(idModelExport), idModelExport_typeInfo },
@@ -8731,9 +9033,6 @@ static classTypeInfo_t classTypeInfo[] = {
{ "predictedPath_t", "", sizeof(predictedPath_t), predictedPath_t_typeInfo },
{ "particleEmitter_t", "", sizeof(particleEmitter_t), particleEmitter_t_typeInfo },
{ "idMoveState", "", sizeof(idMoveState), idMoveState_typeInfo },
- { "idAASFindCover", "idAASCallback", sizeof(idAASFindCover), idAASFindCover_typeInfo },
- { "idAASFindAreaOutOfRange", "idAASCallback", sizeof(idAASFindAreaOutOfRange), idAASFindAreaOutOfRange_typeInfo },
- { "idAASFindAttackPosition", "idAASCallback", sizeof(idAASFindAttackPosition), idAASFindAttackPosition_typeInfo },
{ "idAI", "idActor", sizeof(idAI), idAI_typeInfo },
{ "idCombatNode", "idEntity", sizeof(idCombatNode), idCombatNode_typeInfo },
{ "idAI_Vagary", "idAI", sizeof(idAI_Vagary), idAI_Vagary_typeInfo },
@@ -8757,6 +9056,30 @@ static classTypeInfo_t classTypeInfo[] = {
{ "rvmWeaponHandgrenade", "rvmWeaponObject", sizeof(rvmWeaponHandgrenade), rvmWeaponHandgrenade_typeInfo },
{ "rvmWeaponChainsaw", "rvmWeaponObject", sizeof(rvmWeaponChainsaw), rvmWeaponChainsaw_typeInfo },
{ "rvmWeaponGrabber", "rvmWeaponObject", sizeof(rvmWeaponGrabber), rvmWeaponGrabber_typeInfo },
+ { "fuzzyseperator_t", "", sizeof(fuzzyseperator_t), fuzzyseperator_t_typeInfo },
+ { "weight_t", "", sizeof(weight_t), weight_t_typeInfo },
+ { "weightconfig_t", "", sizeof(weightconfig_t), weightconfig_t_typeInfo },
+ { "cvalue", "", sizeof(cvalue), cvalue_typeInfo },
+ { "bot_characteristic_t", "", sizeof(bot_characteristic_t), bot_characteristic_t_typeInfo },
+ { "bot_character_t", "", sizeof(bot_character_t), bot_character_t_typeInfo },
+ { "bot_input_t", "", sizeof(bot_input_t), bot_input_t_typeInfo },
+ { "rvmBotUtil", "", sizeof(rvmBotUtil), rvmBotUtil_typeInfo },
+ { "idBotCharacterStatsManager", "", sizeof(idBotCharacterStatsManager), idBotCharacterStatsManager_typeInfo },
+ { "idBotFuzzyWeightManager", "", sizeof(idBotFuzzyWeightManager), idBotFuzzyWeightManager_typeInfo },
+ { "projectileinfo_t", "", sizeof(projectileinfo_t), projectileinfo_t_typeInfo },
+ { "weaponinfo_t", "", sizeof(weaponinfo_t), weaponinfo_t_typeInfo },
+ { "bot_weaponstate_t", "", sizeof(bot_weaponstate_t), bot_weaponstate_t_typeInfo },
+ { "idBotWeaponInfoManager", "", sizeof(idBotWeaponInfoManager), idBotWeaponInfoManager_typeInfo },
+ { "bot_goal_t", "", sizeof(bot_goal_t), bot_goal_t_typeInfo },
+ { "maplocation_t", "", sizeof(maplocation_t), maplocation_t_typeInfo },
+ { "campspot_t", "", sizeof(campspot_t), campspot_t_typeInfo },
+ { "levelitem_t", "", sizeof(levelitem_t), levelitem_t_typeInfo },
+ { "iteminfo_t", "", sizeof(iteminfo_t), iteminfo_t_typeInfo },
+ { "itemconfig_t", "", sizeof(itemconfig_t), itemconfig_t_typeInfo },
+ { "bot_goalstate_t", "", sizeof(bot_goalstate_t), bot_goalstate_t_typeInfo },
+ { "idBotGoalManager", "", sizeof(idBotGoalManager), idBotGoalManager_typeInfo },
+ { "bot_state_t", "", sizeof(bot_state_t), bot_state_t_typeInfo },
+ { "rvmBot", "idPlayer", sizeof(rvmBot), rvmBot_typeInfo },
{ NULL, NULL, 0, NULL }
};
diff --git a/neo/doom3/game/gamesys/SysCmds.cpp b/neo/doom3/game/gamesys/SysCmds.cpp
index 30b0f94a..1bcf001a 100644
--- a/neo/doom3/game/gamesys/SysCmds.cpp
+++ b/neo/doom3/game/gamesys/SysCmds.cpp
@@ -265,6 +265,19 @@ void Cmd_KillRagdolls_f( const idCmdArgs &args ) {
KillEntities( args, idAFEntity_WithAttachedHead::Type );
}
+/*
+===============
+Cmd_AddBot_f
+===============
+*/
+void Cmd_AddBot_f(const idCmdArgs& args) {
+ if (!gameLocal.isServer) {
+ common->Warning("You can't add a bot because you aren't the server!\n");
+ return;
+ }
+ gameLocal.AddBot();
+}
+
/*
==================
Cmd_Give_f
@@ -2292,6 +2305,7 @@ so it can perform tab completion
=================
*/
void idGameLocal::InitConsoleCommands( void ) {
+ cmdSystem->AddCommand("addbot", Cmd_AddBot_f, CMD_FL_GAME, "adds a bot to the game.");
cmdSystem->AddCommand( "game_memory", idClass::DisplayInfo_f, CMD_FL_GAME, "displays game class info" );
cmdSystem->AddCommand( "listClasses", idClass::ListClasses_f, CMD_FL_GAME, "lists game classes" );
cmdSystem->AddCommand( "listThreads", idThread::ListThreads_f, CMD_FL_GAME|CMD_FL_CHEAT, "lists script threads" );
diff --git a/neo/doom3/game/physics/Clip.cpp b/neo/doom3/game/physics/Clip.cpp
index 2f29ce23..89d86865 100644
--- a/neo/doom3/game/physics/Clip.cpp
+++ b/neo/doom3/game/physics/Clip.cpp
@@ -682,7 +682,6 @@ idClip::Init
===============
*/
void idClip::Init( void ) {
- cmHandle_t h;
idVec3 size, maxSector = vec3_origin;
// clear clip sectors
@@ -691,8 +690,8 @@ void idClip::Init( void ) {
numClipSectors = 0;
touchCount = -1;
// get world map bounds
- h = collisionModelManager->LoadModel( "worldMap", false );
- collisionModelManager->GetModelBounds( h, worldBounds );
+ worldCollisionModel = collisionModelManager->LoadModel( "worldMap", false );
+ collisionModelManager->GetModelBounds(worldCollisionModel, worldBounds );
// create world sectors
CreateClipSectors_r( 0, worldBounds, maxSector );
@@ -1664,3 +1663,31 @@ bool idClip::DrawModelContactFeature( const contactInfo_t &contact, const idClip
return true;
}
+
+
+/*
+============
+idClip::PointContents
+============
+*/
+int idClip::PointContents(const idVec3 p)
+{
+ int contents = -1;
+
+ contents = collisionModelManager->PointContents(p, worldCollisionModel);
+ if (contents > 0)
+ {
+ return contents;
+ }
+
+ //for (int i = 0; i < collisionModelManager->GetNumInlinedProcClipModels(); i++)
+ //{
+ // idCollisionModel* cm = collisionModelManager->GetCollisionModel(i + 1);
+ // if (cm == NULL)
+ // continue;
+ //
+ // contents = collisionModelManager->PointContents(p, cm);
+ //}
+
+ return contents;
+}
\ No newline at end of file
diff --git a/neo/doom3/game/physics/Clip.h b/neo/doom3/game/physics/Clip.h
index e7ad0e52..5b7b326c 100644
--- a/neo/doom3/game/physics/Clip.h
+++ b/neo/doom3/game/physics/Clip.h
@@ -306,7 +306,10 @@ public:
void DrawClipModels( const idVec3 &eye, const float radius, const idEntity *passEntity );
bool DrawModelContactFeature( const contactInfo_t &contact, const idClipModel *clipModel, int lifetime ) const;
+ int PointContents(const idVec3 p);
+
private:
+ cmHandle_t worldCollisionModel;
int numClipSectors;
struct clipSector_s * clipSectors;
idBounds worldBounds;
diff --git a/neo/engine/cm/CollisionModel.h b/neo/engine/cm/CollisionModel.h
index 2915fe7f..f1df5d18 100644
--- a/neo/engine/cm/CollisionModel.h
+++ b/neo/engine/cm/CollisionModel.h
@@ -141,6 +141,8 @@ public:
virtual void ListModels( void ) = 0;
// Writes a collision model file for the given map entity.
virtual bool WriteCollisionModelForMapEntity( const idMapEntity *mapEnt, const char *filename, const bool testTraceModel = true ) = 0;
+
+ virtual int PointContents(const idVec3 p, cmHandle_t model) = 0;
};
extern idCollisionModelManager * collisionModelManager;
diff --git a/neo/engine/cm/CollisionModel_local.h b/neo/engine/cm/CollisionModel_local.h
index 5201cdc6..f77d34b7 100644
--- a/neo/engine/cm/CollisionModel_local.h
+++ b/neo/engine/cm/CollisionModel_local.h
@@ -345,6 +345,8 @@ public:
// write a collision model file for the map entity
bool WriteCollisionModelForMapEntity( const idMapEntity *mapEnt, const char *filename, const bool testTraceModel = true );
+
+ virtual int PointContents(const idVec3 p, cmHandle_t model);
private: // CollisionMap_translate.cpp
int TranslateEdgeThroughEdge( idVec3 &cross, idPluecker &l1, idPluecker &l2, float *fraction );
void TranslateTrmEdgeThroughPolygon( cm_traceWork_t *tw, cm_polygon_t *poly, cm_trmEdge_t *trmEdge );
@@ -387,7 +389,6 @@ private: // CollisionMap_contents.cpp
bool TestTrmVertsInBrush( cm_traceWork_t *tw, cm_brush_t *b );
bool TestTrmInPolygon( cm_traceWork_t *tw, cm_polygon_t *p );
cm_node_t * PointNode( const idVec3 &p, cm_model_t *model );
- int PointContents( const idVec3 p, cmHandle_t model );
int TransformedPointContents( const idVec3 &p, cmHandle_t model, const idVec3 &origin, const idMat3 &modelAxis );
int ContentsTrm( trace_t *results, const idVec3 &start,
const idTraceModel *trm, const idMat3 &trmAxis, int contentMask,
diff --git a/neo/engine/doomdll.vcxproj.user b/neo/engine/doomdll.vcxproj.user
index 98768e62..6cbc4a14 100644
--- a/neo/engine/doomdll.vcxproj.user
+++ b/neo/engine/doomdll.vcxproj.user
@@ -15,9 +15,9 @@
D:\projects\Doom3\Doom3.exe
WindowsLocalDebugger
- +set r_fullscreen 0 +set r_mode 9
+ +set r_fullscreen 0 +set r_mode 9 +set sv_pure 0
D:\projects\Doom3
- +set r_fullscreen 1 +set r_mode 10|+set r_fullscreen 1 +set r_mode 9|+set r_fullscreen 1 +set r_mode 11|+set r_fullscreen0 +set r_mode 9|+set r_fullscreen 0 +set r_mode 9|
+ +set r_fullscreen 1 +set r_mode 9|+set r_fullscreen 1 +set r_mode 11|+set r_fullscreen0 +set r_mode 9|+set r_fullscreen 0 +set r_mode 9|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0|
D:\projects\Doom3\Quake4.exe
diff --git a/neo/engine/framework/FileSystem.cpp b/neo/engine/framework/FileSystem.cpp
index 822bc1b0..fd4d77ca 100644
--- a/neo/engine/framework/FileSystem.cpp
+++ b/neo/engine/framework/FileSystem.cpp
@@ -2523,7 +2523,7 @@ bool idFileSystemLocal::UpdateGamePakChecksums( void ) {
}
}
}
-
+#ifndef ID_ALLOW_TOOLS
// some sanity checks on the game code references
// make sure that at least the local OS got a pure reference
if ( !gamePakForOS[ BUILD_OS_ID ] ) {
@@ -2536,7 +2536,7 @@ bool idFileSystemLocal::UpdateGamePakChecksums( void ) {
common->Warning( "The current game code doesn't match pak files (net_serverAllowServerMod is off)" );
return false;
}
-
+#endif
return true;
}
@@ -3011,6 +3011,10 @@ bool idFileSystemLocal::FileAllowedFromDir( const char *path ) {
l = strlen( path );
+#ifdef ID_ALLOW_TOOLS
+ return true;
+#endif
+
if ( !strcmp( path + l - 4, ".cfg" ) // for config files
|| !strcmp( path + l - 4, ".dat" ) // for journal files
|| !strcmp( path + l - 4, ".dll" ) // dynamic modules are handled a different way for pure
diff --git a/neo/engine/framework/Session.cpp b/neo/engine/framework/Session.cpp
index 5991ebb4..26f31a9e 100644
--- a/neo/engine/framework/Session.cpp
+++ b/neo/engine/framework/Session.cpp
@@ -1832,7 +1832,7 @@ void idSessionLocal::ExecuteMapChange( bool noFadeWipe ) {
if ( !idAsyncNetwork::IsActive() && !loadingSaveGame ) {
// spawn players
for ( i = 0; i < numClients; i++ ) {
- game->SpawnPlayer( i );
+ game->SpawnPlayer( i, false );
}
}
diff --git a/neo/engine/framework/async/AsyncServer.cpp b/neo/engine/framework/async/AsyncServer.cpp
index 6eba7086..fd5965e2 100644
--- a/neo/engine/framework/async/AsyncServer.cpp
+++ b/neo/engine/framework/async/AsyncServer.cpp
@@ -322,7 +322,7 @@ void idAsyncServer::ExecuteMapChange( void ) {
memset( userCmds, 0, sizeof( userCmds ) );
if ( idAsyncNetwork::serverDedicated.GetInteger() == 0 ) {
- InitLocalClient( 0 );
+ InitLocalClient( 0, false );
#ifdef QUAKE4
//session->EmitClientAuth(); -- jmarshall
#endif
@@ -725,13 +725,22 @@ void idAsyncServer::InitClient( int clientNum, int clientId, int clientRate ) {
idAsyncServer::InitLocalClient
==================
*/
-void idAsyncServer::InitLocalClient( int clientNum ) {
+void idAsyncServer::InitLocalClient( int clientNum, bool isBot ) {
netadr_t badAddress;
- localClientNum = clientNum;
InitClient( clientNum, 0, 0 );
memset( &badAddress, 0, sizeof( badAddress ) );
- badAddress.type = NA_BAD;
+ // jmarshall
+ if (isBot)
+ {
+ badAddress.type = NA_BOT;
+ }
+ else
+ {
+ badAddress.type = NA_BAD;
+ localClientNum = clientNum;
+ }
+ // jmarshall end
clients[clientNum].channel.Init( badAddress, serverId );
clients[clientNum].clientState = SCS_INGAME;
#ifdef QUAKE4
@@ -753,7 +762,7 @@ void idAsyncServer::BeginLocalClient( void ) {
game->SetUserInfo( localClientNum, sessLocal.mapSpawnData.userInfo[localClientNum], false, false );
#endif
- game->ServerClientBegin( localClientNum );
+ game->ServerClientBegin( localClientNum, false );
#ifdef QUAKE4
game->SetFriend( localClientNum, idAsyncNetwork::client.serverList.IsAFriend( localClientNum ) );
#endif
@@ -834,6 +843,11 @@ void idAsyncServer::SendReliableMessage( int clientNum, const idBitMsg &msg ) {
if ( clientNum == localClientNum ) {
return;
}
+// jmarshall
+ if (clients[clientNum].channel.GetRemoteAddress().type == NA_BOT)
+ return;
+// jmarshall end
+
if ( !clients[ clientNum ].channel.SendReliableMessage( msg ) ) {
clients[ clientNum ].channel.ClearReliableMessages();
DropClient( clientNum, "#str_07136" );
@@ -858,6 +872,11 @@ void idAsyncServer::CheckClientTimeouts( void ) {
continue;
}
+// jmarshall
+ if (client.channel.GetRemoteAddress().type == NA_BOT)
+ continue;
+// jmarshall end
+
if ( client.lastPacketTime > serverTime ) {
client.lastPacketTime = serverTime;
continue;
@@ -1334,7 +1353,7 @@ void idAsyncServer::ProcessUnreliableClientMessage( int clientNum, const idBitMs
SendEnterGameToClient( clientNum );
// get the client running in the game
- game->ServerClientBegin( clientNum );
+ game->ServerClientBegin( clientNum, false );
// write any reliable messages to initialize the client game state
game->ServerWriteInitialReliableMessages( clientNum );
@@ -3033,3 +3052,82 @@ void idAsyncServer::ProcessDownloadRequestMessage( const netadr_t from, const id
serverPort.SendPacket( from, outMsg.GetData(), outMsg.GetSize() );
}
}
+
+// jmarshall
+/*
+===============
+idAsyncServer::ServerSetBotUserCommand
+===============
+*/
+int idAsyncServer::ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd) {
+ usercmd_t realcmd;
+
+ // Ensure this client is a bot.
+ if (clients[clientNum].channel.GetRemoteAddress().type != NA_BOT)
+ return -1;
+
+ realcmd = cmd;
+ realcmd.gameTime = gameFrame;
+ realcmd.duplicateCount = gameTime;
+
+ int index = gameFrame & (MAX_USERCMD_BACKUP - 1);
+ userCmds[index][clientNum] = realcmd;
+
+ return 1;
+}
+
+/*
+===============
+idAsyncServer::AllocOpenClientSlotForAI
+===============
+*/
+int idAsyncServer::AllocOpenClientSlotForAI(int maxPlayersOnServer) {
+ int numActivePlayers = 0;
+ int botClientId = -1;
+ idStr botName;
+ idDict spawnArgs;
+
+ // Check to see how many active players we have.
+ for (int i = 0; i < MAX_ASYNC_CLIENTS; i++)
+ {
+ if (clients[i].clientState >= SCS_PUREWAIT)
+ {
+ numActivePlayers++;
+ }
+ }
+
+ if (numActivePlayers >= maxPlayersOnServer) {
+ common->Warning("idAsyncServer::AllocateClientSlotForBot: No open slots for bot\n");
+ return -1;
+ }
+
+ // Find a free slot for the bot.
+ for (int i = 0; i < MAX_ASYNC_CLIENTS; i++)
+ {
+ if (clients[i].clientState == SCS_FREE)
+ {
+ botClientId = i;
+ break;
+ }
+ }
+
+ if (botClientId == -1)
+ {
+ common->Warning("idAsyncServer::AllocateClientSlotForBot: Invalid client number\n");
+ return -1;
+ }
+
+ game->GetRandomBotName(botClientId, botName);
+
+ idAsyncServer::InitLocalClient(botClientId, true);
+
+ // Set all the spawn args for the new bot.
+ spawnArgs.Set("ui_name", botName);
+
+ // Init the new client, and broadcast it to the rest of the players.
+ game->ServerClientBegin(botClientId, true);
+ idAsyncServer::SendUserInfoBroadcast(botClientId, spawnArgs, true);
+
+ return 1;
+}
+// jmarshall end
\ No newline at end of file
diff --git a/neo/engine/framework/async/AsyncServer.h b/neo/engine/framework/async/AsyncServer.h
index cdd49b4b..2fbef0ef 100644
--- a/neo/engine/framework/async/AsyncServer.h
+++ b/neo/engine/framework/async/AsyncServer.h
@@ -230,7 +230,7 @@ public:
void DuplicateUsercmds( int frame, int time );
void ClearClient( int clientNum );
void InitClient( int clientNum, int clientId, int clientRate );
- void InitLocalClient( int clientNum );
+ void InitLocalClient( int clientNum, bool isBot);
void BeginLocalClient( void );
void LocalClientInput( void );
void CheckClientTimeouts( void );
@@ -267,6 +267,9 @@ public:
void SendGUIDsToClient( int clientNum );
#endif
void ProcessDownloadRequestMessage( const netadr_t from, const idBitMsg &msg );
+
+ int AllocOpenClientSlotForAI(int maxPlayersOnServer);
+ int ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd);
};
#endif /* !__ASYNCSERVER_H__ */
diff --git a/neo/engine/framework/async/NetworkSystem.cpp b/neo/engine/framework/async/NetworkSystem.cpp
index a3aadc2c..fa8d1715 100644
--- a/neo/engine/framework/async/NetworkSystem.cpp
+++ b/neo/engine/framework/async/NetworkSystem.cpp
@@ -526,3 +526,31 @@ const char *idNetworkSystem::GetViewerGUID( int clientNum ) {
}
#endif // QUAKE4
+
+
+/*
+==================
+idNetworkSystem::AllocateClientSlotForBot
+==================
+*/
+int idNetworkSystem::AllocateClientSlotForBot(int maxPlayersOnServer) {
+ return idAsyncNetwork::server.AllocOpenClientSlotForAI(maxPlayersOnServer);
+}
+
+/*
+==================
+idNetworkSystem::ServerSetBotUserCommand
+==================
+*/
+int idNetworkSystem::ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd) {
+ return idAsyncNetwork::server.ServerSetBotUserCommand(clientNum, frameNum, cmd);
+}
+
+/*
+==================
+idNetworkSystem::ServerSetBotUserName
+==================
+*/
+int idNetworkSystem::ServerSetBotUserName(int clientNum, const char* playerName) {
+ return 0;
+}
\ No newline at end of file
diff --git a/neo/engine/framework/async/NetworkSystem.h b/neo/engine/framework/async/NetworkSystem.h
index 538c1b1b..2a2d94e0 100644
--- a/neo/engine/framework/async/NetworkSystem.h
+++ b/neo/engine/framework/async/NetworkSystem.h
@@ -153,6 +153,10 @@ public:
virtual int ClientGetIncomingRate( void );
virtual float ClientGetIncomingPacketLoss( void );
+ virtual int AllocateClientSlotForBot(int maxPlayersOnServer);
+ virtual int ServerSetBotUserCommand(int clientNum, int frameNum, const usercmd_t& cmd);
+ virtual int ServerSetBotUserName(int clientNum, const char* playerName);
+
#endif // QUAKE4
#ifdef QUAKE4
diff --git a/neo/engine/idlib/Lexer.h b/neo/engine/idlib/Lexer.h
index d8814370..f11c0a6a 100644
--- a/neo/engine/idlib/Lexer.h
+++ b/neo/engine/idlib/Lexer.h
@@ -457,5 +457,19 @@ ID_INLINE int idLexer::GetFlags( void ) {
return idLexer::flags;
}
+class rvmScopedLexerBaseFolder
+{
+public:
+ rvmScopedLexerBaseFolder(const char* baseFolder)
+ {
+ idLexer::SetBaseFolder(baseFolder);
+ }
+
+ ~rvmScopedLexerBaseFolder()
+ {
+ idLexer::SetBaseFolder("");
+ }
+};
+
#endif /* !__LEXER_H__ */
diff --git a/neo/engine/idlib/Parser.h b/neo/engine/idlib/Parser.h
index 3e78025d..ed27ea6d 100644
--- a/neo/engine/idlib/Parser.h
+++ b/neo/engine/idlib/Parser.h
@@ -182,6 +182,35 @@ public:
// set the base folder to load files from
static void SetBaseFolder( const char *path );
+ int Parse1DMatrixLegacy(int x, float* m)
+ {
+ int i;
+
+ if (!idParser::ExpectTokenString("{"))
+ {
+ return false;
+ }
+
+ for (i = 0; i < x; i++)
+ {
+ m[i] = idParser::ParseFloat();
+
+ if (i < x - 1)
+ {
+ if (!idParser::ExpectTokenString(","))
+ {
+ return false;
+ }
+ }
+ }
+
+ if (!idParser::ExpectTokenString("}"))
+ {
+ return false;
+ }
+ return true;
+ }
+
private:
int loaded; // set when a source file is loaded from file or memory
idStr filename; // file name of the script
diff --git a/neo/engine/idlib/Str.h b/neo/engine/idlib/Str.h
index ccdd803f..b5e218d2 100644
--- a/neo/engine/idlib/Str.h
+++ b/neo/engine/idlib/Str.h
@@ -317,6 +317,24 @@ public:
static bool CheckExtension(const char* name, const char* ext);
static const char* FloatArrayToString(const float* array, const int length, const int precision);
+ void StripDoubleQuotes(void)
+ {
+ idStr temp = *this;
+ char* string = (char*)temp.c_str();
+
+ if (*string == '\"')
+ {
+ strcpy(string, string + 1);
+ }
+
+ if (string[strlen(string) - 1] == '\"')
+ {
+ string[strlen(string) - 1] = '\0';
+ }
+
+ *this = string;
+ }
+
// hash keys
static int Hash(const char* string);
static int Hash(const char* string, int length);
diff --git a/neo/engine/idlib/math/Math.cpp b/neo/engine/idlib/math/Math.cpp
index d6b4241a..22db3c54 100644
--- a/neo/engine/idlib/math/Math.cpp
+++ b/neo/engine/idlib/math/Math.cpp
@@ -313,3 +313,9 @@ float idMath::ScaleToDb(float scale) {
// RAVEN END
#endif
+
+float idMath::Distance(idVec3 p1, idVec3 p2)
+{
+ idVec3 v = p2 - p1;
+ return v.Length();
+}
diff --git a/neo/engine/idlib/math/Math.h b/neo/engine/idlib/math/Math.h
index a31a350f..c21e7753 100644
--- a/neo/engine/idlib/math/Math.h
+++ b/neo/engine/idlib/math/Math.h
@@ -243,6 +243,28 @@ public:
static int FloatHash(const float* array, const int numFloats);
+ static float AngleMod(float a)
+ {
+ a = (360.0 / 65536) * ((int)(a * (65536 / 360.0)) & 65535);
+ return a;
+ }
+
+ static float Distance(idVec3 p1, idVec3 p2);
+
+ static int Rand()
+ {
+ return rand();
+ }
+ static float FRand()
+ {
+ return Rand() / (float)RAND_MAX;
+ }
+ static float FRandRange(float min, float max)
+ {
+ return min + (max - min) * FRand();
+ }
+
+
static const float PI; // pi
static const float TWO_PI; // pi * 2
static const float HALF_PI; // pi / 2
diff --git a/neo/engine/renderer/Material.h b/neo/engine/renderer/Material.h
index 24fd3e63..c0605a1a 100644
--- a/neo/engine/renderer/Material.h
+++ b/neo/engine/renderer/Material.h
@@ -536,6 +536,12 @@ typedef enum {
#endif
} surfaceFlags_t;
+#ifndef QUAKE4
+#define CONTENTS_SLIME BIT(14) // used for slime
+#define CONTENTS_FOG BIT(15) // used for fog
+#define CONTENTS_LAVA BIT(16)
+#endif
+
class idSoundEmitter;
class idMaterial : public idDecl {
diff --git a/neo/engine/sys/sys_public.h b/neo/engine/sys/sys_public.h
index d945107e..9747fc6d 100644
--- a/neo/engine/sys/sys_public.h
+++ b/neo/engine/sys/sys_public.h
@@ -398,6 +398,7 @@ typedef enum {
NA_BAD, // an address lookup failed
NA_LOOPBACK,
NA_BROADCAST,
+ NA_BOT,
NA_IP
} netadrtype_t;
diff --git a/neo/engine/tools/compilers/aas/AASBuild.cpp b/neo/engine/tools/compilers/aas/AASBuild.cpp
index 09e427c1..8382cbf9 100644
--- a/neo/engine/tools/compilers/aas/AASBuild.cpp
+++ b/neo/engine/tools/compilers/aas/AASBuild.cpp
@@ -665,7 +665,7 @@ bool idAASBuild::Build( const idStr &fileName, const idAASSettings *settings ) {
}
// check if this map has any entities that use this AAS file
- if ( !CheckForEntities( mapFile, entityClassNames ) ) {
+ if ( !CheckForEntities( mapFile, entityClassNames ) && settings->fileExtension != "aas48") {
delete mapFile;
common->Printf( "no entities in map that use %s\n", settings->fileExtension.c_str() );
return true;
@@ -727,7 +727,7 @@ bool idAASBuild::Build( const idStr &fileName, const idAASSettings *settings ) {
bsp.Portalize();
// remove subspaces not reachable by entities
- if ( !bsp.RemoveOutside( mapFile, AREACONTENTS_SOLID, entityClassNames ) ) {
+ if ( !bsp.RemoveOutside( mapFile, AREACONTENTS_SOLID, entityClassNames ) && settings->fileExtension != "aas48") {
bsp.LeakFile( name );
delete mapFile;
common->Printf( "%s has no outside", name.c_str() );