]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Monsters: prepare for classification
authorTimePath <andrew.hardaker1995@gmail.com>
Mon, 28 Sep 2015 03:45:24 +0000 (13:45 +1000)
committerTimePath <andrew.hardaker1995@gmail.com>
Mon, 28 Sep 2015 03:45:24 +0000 (13:45 +1000)
qcsrc/common/animdecide.qc
qcsrc/common/monsters/all.qh
qcsrc/common/monsters/monster.qh
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/monster/shambler.qc
qcsrc/common/monsters/monster/spider.qc
qcsrc/common/monsters/monster/wyvern.qc
qcsrc/common/monsters/monster/zombie.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/server/mutators/gamemode_invasion.qc

index 5c2caa6a7f04c7d8c6a3a9b60040b95e035602ee..7e670ee73691974f8368504073e1a796c6dbe426 100644 (file)
@@ -12,7 +12,7 @@
 
 bool monsters_animoverride(entity e)
 {
-       int monster_id = 0;
+       Monster monster_id = NULL;
        for(int i = MON_FIRST; i <= MON_LAST; ++i)
        {
                entity mon = get_monsterinfo(i);
@@ -20,7 +20,7 @@ bool monsters_animoverride(entity e)
                //if(substring(e.model, 0, strlen(mon.model) - 4) == substring(mon.model, 0, strlen(mon.model) - 4))
                if(e.model == mon.model)
                {
-                       monster_id = i;
+                       monster_id = mon;
                        break;
                }
        }
index 20a2103785f0bffb5b6a14cfe347eac076cc1b6a..ea1eb5158658c00ec967fa412af45016c9e98e21 100644 (file)
@@ -26,14 +26,6 @@ REGISTER_REGISTRY(RegisterMonsters)
 
 #include "../util.qh"
 
-// monster requests
-const int MR_SETUP = 1; // (SERVER) setup monster data
-const int MR_THINK = 2; // (SERVER) logic to run every frame
-const int MR_DEATH = 3; // (SERVER) called when monster dies
-const int MR_PRECACHE = 4; // (BOTH) precaches models/sounds used by this monster
-const int MR_PAIN = 5; // (SERVER) called when monster is damaged
-const int MR_ANIM = 6; // (BOTH?) sets animations for monster
-
 // special spawn flags
 const int MONSTER_RESPAWN_DEATHPOINT = 16; // re-spawn where we died
 const int MONSTER_TYPE_FLY = 32;
@@ -65,7 +57,4 @@ const int MON_FLAG_RIDE = 4096; // monster can be ridden in special modes
 .vector anim_walk;
 .vector anim_spawn;
 
-// other useful macros
-#define MON_ACTION(monstertype,mrequest) (get_monsterinfo(monstertype)).monster_func(mrequest)
-
 #endif
index 79077acc3c111a3988b608ba53c460e920cc40b0..ee1ff994a70174ac61dcec4885f44707e68cfa45 100644 (file)
@@ -1,7 +1,8 @@
 #ifndef MONSTER_H
 #define MONSTER_H
 
-bool m_null(int) { return false; }
+bool m_null(entity thismon, int) { return false; }
+bool m_new(entity thismon, int);
 
 /** If you register a new monster, make sure to add it to all.inc */
 CLASS(Monster, Object)
@@ -9,7 +10,35 @@ CLASS(Monster, Object)
     ATTRIB(Monster, classname, string, "monster_info")
     /** human readable name */
     ATTRIB(Monster, monster_name, string, string_null)
-    ATTRIB(Monster, monster_func, bool(int), m_null)
+    ATTRIB(Monster, monster_func, bool(Monster, int), m_new)
 ENDCLASS(Monster)
 
+// monster requests
+const int MR_SETUP = 1; // (SERVER) setup monster data
+.bool(Monster this) mr_setup;
+const int MR_THINK = 2; // (SERVER) logic to run every frame
+.bool(Monster this) mr_think;
+const int MR_DEATH = 3; // (SERVER) called when monster dies
+.bool(Monster this) mr_death;
+const int MR_PRECACHE = 4; // (BOTH) precaches models/sounds used by this monster
+.bool(Monster this) mr_precache;
+const int MR_PAIN = 5; // (SERVER) called when monster is damaged
+.bool(Monster this) mr_pain;
+const int MR_ANIM = 6; // (BOTH?) sets animations for monster
+.bool(Monster this) mr_anim;
+
+// other useful macros
+#define MON_ACTION(mon,mrequest) mon.monster_func(mon, mrequest)
+#define _MON_ACTION(mon,mrequest) MON_ACTION(get_monsterinfo(mon), mrequest)
+
+bool m_new(entity this, int req) {
+    if (req == MR_SETUP) return this.mr_setup ? this.mr_setup(this) : false;
+    if (req == MR_THINK) return this.mr_think ? this.mr_think(this) : false;
+    if (req == MR_DEATH) return this.mr_death ? this.mr_death(this) : false;
+    if (req == MR_PRECACHE) return this.mr_precache ? this.mr_precache(this) : false;
+    if (req == MR_PAIN) return this.mr_pain ? this.mr_pain(this) : false;
+    if (req == MR_ANIM) return this.mr_anim ? this.mr_anim(this) : false;
+    return false;
+}
+
 #endif
index 291ebe364473d21cc6fba61a136300d1e2c90cac..d0c6f2e29e377bd2a6f79344f3970b5f6febbd1c 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef MENUQC
-bool M_Mage(int);
+bool M_Mage(Monster thismon, int);
 #endif
 REGISTER_MONSTER_SIMPLE(
 /* MON_##id   */ MAGE,
@@ -11,7 +11,7 @@ REGISTER_MONSTER_SIMPLE(
 ) {
 #ifndef MENUQC
     this.monster_func = M_Mage;
-    this.monster_func(MR_PRECACHE);
+    MON_ACTION(this, MR_PRECACHE);
 #endif
 }
 
@@ -368,7 +368,7 @@ void spawnfunc_monster_mage() { Monster_Spawn(MON_MAGE.monsterid); }
 
 #endif // SVQC
 
-bool M_Mage(int req)
+bool M_Mage(Monster thismon, int req)
 {SELFPARAM();
        switch(req)
        {
index 55e0f46e95413053bd525a6ce185437b17c06c88..dff3b7e70e84c219bf4bf9f21ae84ab6efc09739 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef MENUQC
-bool M_Shambler(int);
+bool M_Shambler(Monster thismon, int);
 #endif
 REGISTER_MONSTER_SIMPLE(
 /* MON_##id   */ SHAMBLER,
@@ -11,7 +11,7 @@ REGISTER_MONSTER_SIMPLE(
 ) {
 #ifndef MENUQC
        this.monster_func = M_Shambler;
-       this.monster_func(MR_PRECACHE);
+       MON_ACTION(this, MR_PRECACHE);
 #endif
 }
 
@@ -214,7 +214,7 @@ float M_Shambler_Attack(float attack_type)
 void spawnfunc_monster_shambler() { Monster_Spawn(MON_SHAMBLER.monsterid); }
 #endif // SVQC
 
-bool M_Shambler(int req)
+bool M_Shambler(Monster thismon, int req)
 {SELFPARAM();
        switch(req)
        {
index f6c3089ce358d0c45b64e985f04d507a674d29e5..9b4d3ff2564e090d377e92fdad8656688934b628 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef MENUQC
-bool M_Spider(int);
+bool M_Spider(Monster thismon, int);
 #endif
 REGISTER_MONSTER_SIMPLE(
 /* MON_##id   */ SPIDER,
@@ -11,7 +11,7 @@ REGISTER_MONSTER_SIMPLE(
 ) {
 #ifndef MENUQC
        this.monster_func = M_Spider;
-       this.monster_func(MR_PRECACHE);
+       MON_ACTION(this, MR_PRECACHE);
 #endif
 }
 
@@ -127,7 +127,7 @@ bool M_Spider_Attack(int attack_type)
 void spawnfunc_monster_spider() { Monster_Spawn(MON_SPIDER.monsterid); }
 #endif // SVQC
 
-bool M_Spider(int req)
+bool M_Spider(Monster thismon, int req)
 {SELFPARAM();
        switch(req)
        {
index af174603d26b7e273aee653547c4bc2bf2d25755..2a3ce0b8fdc371ba03432638afb07b61e1ec504a 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef MENUQC
-bool M_Wyvern(int);
+bool M_Wyvern(Monster thismon, int);
 #endif
 REGISTER_MONSTER_SIMPLE(
 /* MON_##id   */ WYVERN,
@@ -11,7 +11,7 @@ REGISTER_MONSTER_SIMPLE(
 ) {
 #ifndef MENUQC
        this.monster_func = M_Wyvern;
-       this.monster_func(MR_PRECACHE);
+       MON_ACTION(this, MR_PRECACHE);
 #endif
 }
 
@@ -104,8 +104,9 @@ float M_Wyvern_Attack(float attack_type)
 void spawnfunc_monster_wyvern() { Monster_Spawn(MON_WYVERN.monsterid); }
 #endif // SVQC
 
-bool M_Wyvern(int req)
-{SELFPARAM();
+bool M_Wyvern(Monster thismon, int req)
+{
+       SELFPARAM();
        switch(req)
        {
                #ifdef SVQC
index ed169c99d736058e8dce676d6bd2c7046b1f0c0b..8511d2e19e6fdf5fc3f6286c442ae417bd110385 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef MENUQC
-bool M_Zombie(int);
+bool M_Zombie(Monster thismon, int);
 #endif
 REGISTER_MONSTER_SIMPLE(
 /* MON_##id   */ ZOMBIE,
@@ -11,7 +11,7 @@ REGISTER_MONSTER_SIMPLE(
 ) {
 #ifndef MENUQC
        this.monster_func = M_Zombie;
-       this.monster_func(MR_PRECACHE);
+       MON_ACTION(this, MR_PRECACHE);
 #endif
 }
 
@@ -141,7 +141,7 @@ float M_Zombie_Attack(float attack_type)
 void spawnfunc_monster_zombie() { Monster_Spawn(MON_ZOMBIE.monsterid); }
 #endif // SVQC
 
-bool M_Zombie(int req)
+bool M_Zombie(Monster thismon, int req)
 {SELFPARAM();
        switch(req)
        {
index 73e6d9060ea80d89205d7cbc48de61ee36582632..5a747532b82a8d01e7def76b33f43a6a25852859 100644 (file)
@@ -471,7 +471,7 @@ void Monster_UpdateModel()
        self.anim_die2   = animfixfps(self, '9 1 0.01', '0 0 0');*/
 
        // then get the real values
-       MON_ACTION(self.monsterid, MR_ANIM);
+       _MON_ACTION(self.monsterid, MR_ANIM);
 }
 
 void Monster_Touch()
@@ -1037,7 +1037,7 @@ void Monster_Dead(entity attacker, float gibbed)
 
        CSQCModel_UnlinkEntity();
 
-       MON_ACTION(self.monsterid, MR_DEATH);
+       _MON_ACTION(self.monsterid, MR_DEATH);
 
        if(self.candrop && self.weapon)
                W_ThrowNewWeapon(self, self.weapon, 0, self.origin, randomvec() * 150 + '0 0 325');
@@ -1070,7 +1070,7 @@ void Monster_Damage(entity inflictor, entity attacker, float damage, int deathty
        damage_take = take;
        frag_attacker = attacker;
        frag_deathtype = deathtype;
-       MON_ACTION(self.monsterid, MR_PAIN);
+       _MON_ACTION(self.monsterid, MR_PAIN);
        take = damage_take;
 
        if(take)
@@ -1231,7 +1231,7 @@ void Monster_Think()
                return;
        }
 
-       if(MON_ACTION(self.monsterid, MR_THINK))
+       if(_MON_ACTION(self.monsterid, MR_THINK))
                Monster_Move(self.speed2, self.speed, self.stopspeed);
 
        Monster_Anim();
@@ -1241,7 +1241,7 @@ void Monster_Think()
 
 float Monster_Spawn_Setup()
 {SELFPARAM();
-       MON_ACTION(self.monsterid, MR_SETUP);
+       _MON_ACTION(self.monsterid, MR_SETUP);
 
        // ensure some basic needs are met
        if(!self.health) { self.health = 100; }
index 412e7bd5405caa28832a5edc54ad8dcd4f01c652..bb36e26542a0ff3262e167163ea7e747379d8cc0 100644 (file)
@@ -14,7 +14,7 @@ void spawnfunc_invasion_spawnpoint()
 
        if(autocvar_g_invasion_zombies_only) // precache only if it hasn't been already
        if(self.monsterid)
-               MON_ACTION(self.monsterid, MR_PRECACHE);
+               _MON_ACTION(self.monsterid, MR_PRECACHE);
 }
 
 float invasion_PickMonster(float supermonster_count)
@@ -431,7 +431,7 @@ void invasion_DelayedInit() // Do this check with a delay so we can wait for tea
 void invasion_Initialize()
 {
        if(autocvar_g_invasion_zombies_only)
-               MON_ACTION(MON_ZOMBIE.monsterid, MR_PRECACHE);
+               MON_ACTION(MON_ZOMBIE, MR_PRECACHE);
        else
        {
                float i;
@@ -442,7 +442,7 @@ void invasion_Initialize()
                        if((mon.spawnflags & MONSTER_TYPE_FLY) || (mon.spawnflags & MONSTER_TYPE_SWIM))
                                continue; // flying/swimming monsters not yet supported
 
-                       MON_ACTION(i, MR_PRECACHE);
+                       MON_ACTION(mon, MR_PRECACHE);
                }
        }