MCPcopy Create free account
hub / github.com/diasurgical/devilution / MAI_Rhino

Function MAI_Rhino

Source/monster.cpp:4043–4111  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4041}
4042
4043void MAI_Rhino(int i)
4044{
4045 MonsterStruct *Monst;
4046 int mx, my, fx, fy;
4047 int v, dist, md;
4048
4049 if ((DWORD)i >= MAXMONSTERS)
4050 app_fatal("MAI_Rhino: Invalid monster %d", i);
4051 Monst = monster + i;
4052 if (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) {
4053 fx = Monst->_menemyx;
4054 fy = Monst->_menemyy;
4055 mx = Monst->_mx - fx;
4056 my = Monst->_my - fy;
4057 md = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);
4058 if (Monst->_msquelch < UCHAR_MAX)
4059 MonstCheckDoors(i);
4060 v = random_(131, 100);
4061 if (abs(mx) >= 2 || abs(my) >= 2) {
4062 if (Monst->_mgoal == MGOAL_MOVE || (abs(mx) >= 5 || abs(my) >= 5) && random_(132, 4) != 0) {
4063 if (Monst->_mgoal != MGOAL_MOVE) {
4064 Monst->_mgoalvar1 = 0;
4065 Monst->_mgoalvar2 = random_(133, 2);
4066 }
4067 Monst->_mgoal = MGOAL_MOVE;
4068 if (abs(mx) > abs(my)) {
4069 dist = abs(mx);
4070 } else {
4071 dist = abs(my);
4072 }
4073 if (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) {
4074 Monst->_mgoal = MGOAL_NORMAL;
4075 } else if (!M_RoundWalk(i, md, &Monst->_mgoalvar2)) {
4076 M_StartDelay(i, random_(125, 10) + 10);
4077 }
4078 }
4079 } else
4080 Monst->_mgoal = MGOAL_NORMAL;
4081 if (Monst->_mgoal == MGOAL_NORMAL) {
4082 if ((abs(mx) >= 5 || abs(my) >= 5)
4083 && v < 2 * Monst->_mint + 43
4084 && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy)) {
4085 if (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, Monst->_menemy, i, 0, 0) != -1) {
4086 if (Monst->MData->snd_special)
4087 PlayEffect(i, 3);
4088 Monst->_mmode = MM_CHARGE;
4089 dMonster[Monst->_mx][Monst->_my] = -1 - i;
4090 }
4091 } else {
4092 if (abs(mx) >= 2 || abs(my) >= 2) {
4093 v = random_(134, 100);
4094 if (v >= 2 * Monst->_mint + 33
4095 && (Monst->_mVar1 != MM_WALK && Monst->_mVar1 != MM_WALK2 && Monst->_mVar1 != MM_WALK3
4096 || Monst->_mVar2
4097 || v >= 2 * Monst->_mint + 83)) {
4098 M_StartDelay(i, random_(135, 10) + 10);
4099 } else {
4100 M_CallWalk(i, md);

Callers

nothing calls this directly

Calls 11

app_fatalFunction · 0.85
GetDirectionFunction · 0.85
MonstCheckDoorsFunction · 0.85
random_Function · 0.85
M_RoundWalkFunction · 0.85
M_StartDelayFunction · 0.85
LineClearF1Function · 0.85
AddMissileFunction · 0.85
PlayEffectFunction · 0.85
M_CallWalkFunction · 0.85
M_StartAttackFunction · 0.85

Tested by

no test coverage detected