ANTAGON.CPP
上传用户:abcdshs
上传日期:2007-01-07
资源大小:1858k
文件大小:4k
源码类别:

游戏

开发平台:

Visual C++

  1. // (C) Copyright 1996 by Anthony J. Carin.  All Rights Reserved.
  2. #include "stdafx.h"
  3. #include "antagon.h"
  4. #include "girl.h"
  5. #include "stdio.h"
  6. char antagonist::NumAttackers = 0;
  7. char antagonist::NumObjects   = 0;
  8. antagonist::antagonist(sextype gender) : qentry()
  9. {
  10.    personal tmp;
  11.    if (gender == FEMALE)
  12.    {
  13.       tmp.load(gallist());
  14.       m_dude  = new girl(&tmp);
  15.    }
  16.    else
  17.    {
  18.       tmp.load(guylist());
  19.       m_dude  = new dude(&tmp);
  20.    }
  21.    common();
  22. }
  23. antagonist::antagonist(CString& str, sextype gender) : qentry()
  24. {
  25.    personal tmp;
  26.    if (gender == FEMALE)
  27.    {
  28.       tmp.load(str);
  29.       m_dude  = new girl(&tmp);
  30.    }
  31.    else
  32.    {
  33.       tmp.load(str);
  34.       m_dude  = new dude(&tmp);
  35.    }
  36.    common();
  37. }
  38. antagonist::~antagonist()
  39. {
  40.    delete controller;
  41.    delete m_dude;
  42.    NumObjects--;
  43. }
  44. void antagonist::common()
  45. {
  46.    if (NumObjects == 0)
  47.        NumAttackers = 0;
  48.    NumObjects++;
  49.    controller = new control(m_dude);
  50.    m_type = ANTAGONIST;
  51.    short dir = random(TC_PI2);
  52.    view ctmp;
  53.    ctmp.setx(tcsin(dir, (float) VIEWRANGE/7));
  54.    ctmp.setz(tccos(dir, (float) VIEWRANGE/7));
  55.    m_dude->setto(ctmp);
  56.    sethesitation(0);
  57.    motionless = FALSE;
  58.    AddedMyself = FALSE;
  59. }
  60. void antagonist::righthandhold(baseobject *b)
  61. {
  62.     m_dude->righthandhold(b);
  63. }
  64. void antagonist::lefthandhold(baseobject *b)
  65. {
  66.     m_dude->lefthandhold(b);
  67. }
  68. void antagonist::shirtcolor(COLORREF c)
  69.     m_dude->shirtcolor(c); 
  70. }
  71. void antagonist::pantscolor(COLORREF c) 
  72.     m_dude->pantscolor(c); 
  73. }
  74. void antagonist::draw()
  75. {
  76.    m_dude->draw();
  77.    controller->issuecommands();
  78.    if (!motionless)
  79.    {
  80.       direction where;
  81.       where = gowhere();
  82.       if (isinfront(where))
  83.       {
  84.          if (!walking)
  85.              controller->stopeverything();
  86.          startwalking();
  87.          walking = TRUE;
  88.       }
  89.       else
  90.       {
  91.          if (walking)
  92.              controller->stopeverything();
  93.          startturning(where);
  94.          walking = FALSE;
  95.       }
  96.    }
  97.    else
  98.    {
  99.        m_hesitatecnt--;
  100.    }
  101.    if (m_dude->isdead() && motionless != TRUE)
  102.    {
  103.        motionless = TRUE;
  104.        m_hesitation = -1;
  105.        m_hesitatecnt = 40;
  106.        controller->falldown();
  107.    }
  108. }
  109. char antagonist::isinfront(direction& d)
  110. {
  111.    direction tmp;
  112.    tmp = m_dude->location().ydirection();
  113.    tmp = tmp-d;
  114.    return (char)(tmp < (direction) TC_PI_4 ||
  115.                  tmp > (direction) -TC_PI_4);
  116. }
  117. void antagonist::startwalking()
  118. {
  119.    float dist;
  120.    dist = m_dude->location().distanceto(Game->LevelPtr()->usercontrol->location());
  121.    if (AddedMyself == TRUE)
  122.    {
  123.        NumAttackers--;
  124.        AddedMyself = FALSE;
  125.    }
  126.    if (NumAttackers > 1 && dist > (VIEWRANGE*.1))
  127.       controller->stopeverything();
  128.    else if (NumAttackers == 0 && dist > (VIEWRANGE*.2))
  129.       controller->runfoward();
  130.    else if (NumAttackers == 0 && dist > (VIEWRANGE*.04))
  131.       controller->stepfoward();
  132.    else if (dist < (VIEWRANGE*.01) || (NumAttackers > 1 && dist < (VIEWRANGE*.1)))
  133.       controller->stepbackward();
  134.    else
  135.    {
  136.       controller->stopeverything();
  137.       if (++m_hesitatecnt > m_hesitation)
  138.       {
  139.           m_hesitatecnt = 0;
  140.           if (random(10) != 3)
  141.               controller->selectpunch(random(100),m_dude->normalpunch());
  142.           else
  143.               controller->selectpunch(random(100),m_dude->personalpunch());
  144.       }
  145.       else if (m_hesitatecnt > (m_hesitation / 3))
  146.       {
  147.           controller->block();
  148.           if (AddedMyself == FALSE)
  149.           {
  150.               NumAttackers++;
  151.               AddedMyself = TRUE;
  152.           }
  153.       }
  154.    }
  155. }
  156. void antagonist::startturning(direction& d)
  157. {
  158.    if (m_dude->location().ydirection() > d)
  159.       controller->turnright();
  160.    else
  161.       controller->turnleft();
  162. }
  163. direction antagonist::gowhere()
  164. {
  165.    return m_dude->location().ydirectionto(Game->LevelPtr()->usercontrol->location());
  166. }
  167. view& antagonist::location()
  168. {
  169.     return m_dude->location();
  170. }
  171. CString& antagonist::dudelist(LPCTSTR file)
  172. {
  173.     return picklist((float)random(100)/100.0f, (CString)file);
  174. }